【题目】
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的最大质数因子是多少?
【思路】求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止。
【代码】
void test3()
{
int isprime, mod;
long double num = 600851475143, i, j;
for (i = 3; i < num / 2; i += 2)
{
isprime = 1;
mod = (int)fmod(num, i);
if (mod == 0)
{
mod = (int)fmod(i, 2);
if (mod == 1)
{
isprime = 0;
for (j = 3; j < sqrt(i); j += 2)
{
mod = (int)fmod(i, j);
if (mod == 0)
{
isprime = 1;
break;
}
}
}
if (isprime == 0)
{
num /= i;
}
}
}
printf("result: %d\n\n",(int) num);
}
【说明】
用到了库函数fmod函数,以下为该函数的说明:
原型:float fmod(float x, float y);
用法:#include <math.h>
功能:计算x/y的余数
说明:返回x-n*y,符号同y。n=[x/y](向离开零的方向取整
【思路】Pollard Rho快速因数分解。
上图中,外部循环用于求唯一因数,内部循环用于求该因数的多个副本。
【优化】由于该问题不需要求出每一个质因数,故此处不需要内部循环,另外
600851475143为一个很大的奇数,所以初始是a的值可以从3开始,并且偶数均不可能为其因子,故步长可优化为a+=2;
【代码】
void test3()
{
long long int num=600851475143;
long long int i=3;
while(i<num)
{
if(num%i==0)
num/=i;
else
i+=2;
}
cout<<num<<endl;
}
【答案】运行程序后,可以得到结果为 6857.