这应该找到一个数字的最大素数因子..但它不起作用.. 答案应该是6857,但它返回688543 ..
int isPrime(unsigned long int n)
{
for(unsigned long int i=2;i*i<(n);i++)
{
if(n%i==0)
{
return 0;
break;
}
}
return 1;
}
int main()
{
unsigned long int num=600851475143;
unsigned long int max=2, i=2;
while(num!=1)
{
if(num%i==0 && isPrime(i))
{
max=i;
num/=i;
i--;
}
i++;
}
cout<<max;
return 0;
}
提前致谢:)
答案 0 :(得分:0)
unsigned long
显然是您系统上的32位,因此num
不会是600851475143
,而是600851475143 mod 1<<32
,即3851020999
。 688543
是此数字的最大素数因子,因此您的算法似乎至少可以正常工作。
在编译器/系统组合中查找类型的最大范围,然后选择合适的范围。
答案 1 :(得分:0)
在其他问题中,这将是一个大数字的问题:
for(unsigned long int i=2;i*i<(n);i++)
i*i
对于大数字会溢出unsigned long
(在您编译的系统上似乎是32位)。
您可以通过切换来修复它:
for (unsigned long int i = 2; i <= sqrt(n); ++i)
只要n
没有溢出,sqrt(n)
就会有效。但是,如果要使用非常接近32位整数边界的数字,我仍然建议切换到使用unsigned long long
。