프로젝트 오일러의 문제는 대개 영원히 걸릴 문제를 수행하는 명백한 brute-force 방법이 있다는 것입니다. 질문이 어려워 질수록 똑똑한 솔루션을 구현해야합니다.
이 문제를 해결할 수있는 한 가지 방법은 항상 숫자의 최소 (양의 정수) 요소를 찾는 루프를 사용하는 것입니다. 숫자의 가장 작은 요소가 그 숫자라면 가장 큰 소수 요소를 찾았습니다!
자세한 알고리즘 설명 :
당신은 세 가지 변수를 유지하여이 작업을 수행 할 수 있습니다 :
당신이 인수 분해하려고하는 수 (A) 현재 제수 저장소 (B) 가장 큰 약수 점 (C)
처음에는 관심이있는 숫자를 -이 경우는 600851475143이라고합시다. 그러면 (B)를 2로합시다. (A)가 (B)로 나눌 수 있는지 확인하는 조건이 있습니다. . 분할 할 수 있다면 (A)를 (B)로 나누고, (B)를 2로 재설정하고 (A)가 (B)로 나눌 수 있는지 확인합니다. 그렇지 않으면 (A)가 (B)로 나눌 수 없다면, (B)를 +1만큼 증가시킨 다음 (A)가 (B)로 나눌 수 있는지 확인하십시오. (A)가 1이 될 때까지 루프를 실행하십시오. (3)은 600851475143의 가장 큰 소수가 될 것입니다.
다음 정수로 증가하는 대신 여러 가지 방법으로 효과를 높일 수 있습니다. 다음 필수 정수로 증가하고, 가장 큰 약수를 유지하는 대신, 유일한 제수가 자체 일 때 현재 숫자를 반환 할 수 있습니다. 그러나 위에서 설명한 알고리즘은 아무런 문제없이 초 단위로 실행됩니다. 다음과 같이 파이썬
구현은 다음과 같습니다 -
def lpf(x):
lpf = 2;
while (x > lpf):
if (x%lpf==0):
x = x/lpf
lpf = 2
else:
lpf+=1;
print("Largest Prime Factor: %d" % (lpf));
def main():
x = long(raw_input("Input long int:"))
lpf(x);
return 0;
if __name__ == '__main__':
main()
예 :의 위에서 설명한 방법을 사용하여 105의 가장 큰 소인수를 찾아 보자.
(A) = 105. (B) = 2 (항상 2로 시작), 아직 (C)에 대한 값이 없습니다.
(A)는 (B)로 나눌 수 있습니까? +1 증가분 (B) : (B) = 3. Is (A)가 (B)로 나눌 수 있습니까? 예. (105/3 = 35). 업데이트 (A) = 35. 재설정 (B) = 2
이제 (A)를 (B)로 나눌 수 있습니까? +1 증가분 (B) : (B) = 3. (A)가 (B)로 나눌 수 있습니까? +1 증가분 (B) : (B) = 4. (A)가 (B)로 나눌 수 있습니까? +1 증가분 (B) : (B) = 5. (A)가 (B)로 나눌 수 있습니까? 예. (35/5 = 7). 이전에 발견 한 가장 큰 약수는 (C)에 저장됩니다. (C)는 현재 3입니다. 5는 3보다 큽니다. 따라서 (C) = 5를 업데이트합니다. (A) = 7을 업데이트합니다. (B) = 2로 재설정합니다.
우리는 (A)에 대한 과정을 반복하되, 7이 소수이고 자신과 1 이외의 제수가 없으므로 (B) = (A)까지 계속 증가시킬 것입니다. (우리는 이미 숫자의 절반보다 큰 정수를 가질 수 없으므로 (B)> ((A)/2) 일 때 중단하십시오. 숫자의 최소 제수 (1이 아닌 숫자)는 2입니다!)
그래서 우리가 돌려주는 지점 (A) = 7.
손으로 다음의 몇 가지 일을 시도하고 당신이 생각 나는 당신의 마법`notPrime() '함수의 구현을보고 싶습니다
의 요령을 얻을 것이다. :) –
heh, 간단합니다 : notPrime (n) = (getLowestDivisiblePrimeNumber (n) == n). –
솔직히 말해서, 나는 (사실) 그곳에서 사용한다. 이렇게 설명하는 것이 더 쉬웠다. 내 getLowestDivisiblePrime 메서드는 ArrayList를 참조합니다 primeList; primeList에 나눌 수없는 소수가 없으면 primeList에 추가 할 다음 소수를 찾은 다음 'number'가 나눌 수있는 소수를 찾을 때까지 계속합니다 (나중에 더 많은 소수 목록을 참조 할 것입니다) , 또는 primeList의 가장 큰 소수가 'number'의 sqaureroot보다 커질 때까지. 마술은 없지만, 나는 그것이 상당히 효율적이기를 바랄뿐입니다. = P –
Jonathan