1. 개념
먼저, 완벽한 숫자가 무엇인지 이해합시다.
문제 설명 : 자연 숫자 인 경우 모든 실제 요소 (즉, 자체 이외의 분할)의 합은 정확히 동일 하며이 숫자를 전체 숫자라고합니다. "완성 된 숫자"로 약칭
예를 들어,
6 = 1+2+3
28 = 1+2+4+7+14
496 = 1+2+4+8+16+31+62+124+248
8128 = 1+2+4+8+16+32+64+127+254+508+1016+2032+4064
완성 된 숫자의 정의에 따르면 프로그램을 사용하여 숫자를 해결하는 것은 그리 어렵지 않습니다. 먼저이 숫자의 모든 실제 요소를 해결 한 다음 추가하여 동등한 지 확인하십시오. 그러나이 숫자가 매우 작을 때는 아무런 문제가 없습니다. 이 숫자가 특정 값을 초과하면 문제가 발생하고 프로그램의 실행 효율이 모욕됩니다.
프로그램의 알고리즘 논리를 최적화 할 때 종종 컴퓨터의 특성을 효율적으로 활용하는 방법을 고려하십시오. 그것이 정의하는 알고리즘에 반복되는 쓸모없는 작업이 많이 있습니까? 이 사고 라인 에서이 문제를 고려함으로써 곧 또 다른 해결책을 얻을 것입니다.
2. 설명
2.1 분석
여기에서 우리는 앞에서 언급 한 분해 요소를 쉽게 생각할 수 있습니까? 예, 완벽한 숫자를 해결할 때 분해 요소를 사용합니다. 일반적으로 완벽한 숫자를 풀면 세 가지 단계를 거칩니다.
1. 특정 수의 소수를 찾으십시오
2. 소수 테이블을 사용하여 지정된 숫자의 인수화를 찾으십시오.
3. 요인화를 사용하여 모든 진정한 요소를 찾아 완벽한 숫자인지 확인하십시오.
2.2 어려움
첫 번째 살펴보면 첫 번째 및 두 번째 단계에 문제가 없습니다. 우리는 이전 두 기사에서 논의했습니다. 명확하지 않은 학생들은 그것을 확인할 수 있습니다.
핵심 요점은 세 번째 단계에서 실제 요소 합을 찾는 방법입니다. 이 방법은 매우 간단합니다. 먼저 진정한 요소를 추가하고 (진정한 요소의 개념을 모르는 학생들은 가고 살펴보고 숫자 자체를 추가하면 숫자의 두 배가 될 것임을 알아야합니다 (일부 학생들은 알지 못하지만 지금은 알아야합니까?).
2 * 28 = 1 + 2 + 4 + 7 + 14 + 28
실제로이 방정식은 다음으로 변환 될 수 있습니다. (코드 입력 오류, 스크린 샷을 사용했습니다)
발견? 2와 7은 모두 인수화되어 있으므로 프로그램을 단순화 할 수 있습니까?
2.3 결론
요인화 만 필요하며 루프를 사용하여 방정식 후 값을 찾아서 값을 2로 나눌 수 있습니다. 방정식을 처음 보면 방정식 시리즈 공식을 사용하여 해결할 수 있지만 전원 작동을 사용합니다. 인수화 배열을 읽을 때 동시에 방정식 다음 값을 계산할 수 있습니다.
3. 코드
java.util.arraylist 가져 오기; // 완벽한 숫자 공개 클래스를 풀어냅니다 {// 값으로 전달하고 적어도 얼마나 많은 완벽한 숫자를 해결하십시오 ArrayList List = New ArrayList (); for (int i = 1; i <= number; i ++) {int [] accers = 계수 (primes, i); if (i == fsum (factors)) list.add (new Integer (i)); } int [] p = new int [list.size ()]; Object [] objs = list.toArray (); for (int i = 0; i <p.length; i ++) {p [i] = ((정수) objs [i]). intvalue (); } 반환 p; } // 팩터 비공개 정적 int [] 요소 (int [] primes, int number) {int [] frecord = new int [number]; int k = 0; for (int i = 0; math.pow (primes [i], 2) <= number;) {if (number % primes [i] == 0) {frecord [k] = primes [i]; K ++; 숫자 /= 프라임 [i]; } else i ++; } frecord [k] = 숫자; 반환 프록 코드; } // 팩터 합계 private static int fsum (int [] farr) {int i, r, s, q; i = 0; r = 1; s = 1; Q = 1; while (i <farr.length) {do {r *= farr [i]; Q += R; i ++; } while (i <farr.length -1 && farr [i -1] == farr [i]); s *= q; r = 1; Q = 1; } 반환 s / 2; } public static void main (String [] args) {int [] pn = perfectNumber.less than (1000); for (int i = 0; i <pn.length; i ++) {system.out.print (pn [i]+""); } system.out.println (); }}요약
위의 것은이 기사에서 완벽한 숫자 코드 분석에 관한 것입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨주십시오.