The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

해석

13195의 소수인 약수는 5, 7, 13과 29 이다

600851475143의 가장 큰 소수인 약수는 무엇인가

 

 

코드는 다음과 같다

public static void main(String[] args){
		long target = 600851475143L;
		long ans = find_P(target);
		System.out.println(ans);
	}
	
static int find_P(long target){
	long buf = target; 
	int ans=2;
	
	while(buf > ans){
	    if(buf % ans == 0){
	        buf = buf/ans;
	    }
	    else{
	        ans++;
	    }
	}
	return ans;
}

 

이 문제를 푸는데 핵심은 BruteForce 방법을 이용하지 않고 문제를 풀 수 있느냐를 물어보는 것 같다

(혹시나 BruteForce를 사용한다고 해도 설마 loop의 range를 주어진 수 전체로 두지는 않겠지...?

소수인 약수는 는 주어진 수의 0.5배를 넘을 수 없다! 

예를 들어 주어진 수가 10이라 하면 5이상의 소수는 절대 10의 약수가 될 수 없다는 것을 바로 알것이다)

 

1~5번째 줄은 main method를 돌리는 거라 크게 볼건 없고

 

7~20번째 줄까지 살펴 보면 된다 

 

8번째 줄에서 'target' parameter를 buf 로 복사하는 이유는 Call by value 형식으로 변수가 넘어오기 떄문이기도 하고

주어진 수를 소수인 약수로 계속하여 갱신하기 때문이다

 

9번째 줄의 'ans' 변수는 소수를 저장하는 변수이다 

 

11번째 줄에서는 buf가 ans보다 클 경우 안의 코드를 실행하는데,

ans는 계속 늘어나는 소수이고, buf는 ans로 나눠지지 않을 때까지 나눠지는 수이기 때문에

마지막에 최종 제일 큰 소수가 ans에 할당되면 while문을 탈출하게 된다. 

 

12번째줄의 if 문에서 만약 ans로 buf를 나눌수 있으면 buf를 나눈다

그렇지 않으면 15번째 줄 else문에서 ans를 증가시킨다

 

여기서 포인트는 어떠한 수이던 간에 소수인 약수는 단 한번밖에 나오지 않기 때문에 이런식으로 값을 구할 수 있다. 

예를들어 81이라는 숫자는 3의 4승인데, 3이 4번 곱해져서 그렇지 소수인 약수는 3밖에 없다,

 

위 코드는 일종의 제일 큰 수를 저장하는 기능이 있는 소인수 분해코드라고 보면 된다. 

'Programming > ProjectEuler' 카테고리의 다른 글

ProjectEuler 2  (0) 2021.01.04
ProjectEuler 1  (0) 2021.01.04

+ Recent posts