반응형
이번 문제는 주어진 수에 대해서 가장 큰 소인수를 찾는 프로그램입니다.
사실 에라스토테네스의 체를 이용하여 가장 큰 소인수를 찾을 수밖에 없습니다.
일단 필요한 것은 주어진 수를 계속 나누기 하는 것입니다. 프로그램 역시 이 범주를 벗어나지 않습니다.
조금 속도를 빠르게 하기 위해서는 소수의 일반적인 형태, 2를 제외한 모든 소수는 홀수이다.
홀수 소인수는 6k+1, 6k+5를 가진다 등을 이용해서 시도횟수를 줄일 수는 있습니다.
이번에는 더 효율적인 알고리즘을 찾기 위한 방법은 별로 없어보이네요.
간단하게 프로그램을 짜보면 다음과 같습니다.
int main()
{
int p = 3;
int64 n = 600851475143;
while( n%2 == 0 ) n /= 2;
if( n == 1 ) { printf("Ans = 2\n"); return 0; }
while( 1 )
{
while( n%p == 0 ) n /= p;
if( n == 1 ) break;
p += 2;
}
printf("Ans = %d\n", p);
return 0;
}
728x90
'Programming > Project Euler' 카테고리의 다른 글
[C/C++] 프로젝트 오일러 #5 : 1~20으로 나누어지는 가장 작은 자연수(수학) (0) | 2014.12.22 |
---|---|
4. 프로젝트 오일러 #4 : 가장 큰 대칭수 구하기 (0) | 2014.12.19 |
프로젝트 오일러 #2 피보나치 수열의 짝수항 합 (0) | 2014.12.19 |
프로젝트 오일러 #1 3 또는 5의 배수의 합 (0) | 2014.12.18 |
프로젝트 오일러 #0 시작하며 (0) | 2014.12.18 |
댓글