【发布时间】:2021-04-14 09:19:56
【问题描述】:
我正在尝试这个问题。
13195的质因数是5、7、13和29。600851475143的最大质因数是多少?
我写了以下代码:
#include<iostream>
#define num 600851475143
using namespace std;
int isprime(unsigned long long int n)
{
unsigned long long int c=0;
for(unsigned long long int i=2;i<n;i++)
{
if(n%i==0)
{
c++;
break;
}
}
if(c==0)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
unsigned long long int a,i,n=num;
while(n-- && n>1)
{
if(isprime(n)==1 && num%n==0)
{
cout<<n;
break;
}
}
return 0;
}
代码出现的问题是它适用于 13195 和其他小值。但是没有得到 600851475143 的任何输出。任何人都可以解释为什么它不适用于大值,并告诉应该在这些中进行的更改以获得正确的输出。
【问题讨论】:
-
可能程序运行了很长时间才能完成,而您的输出中没有换行符,这会刷新标准输出缓冲区。在代码中添加一些
couts,看看它是否还在运行。 -
每 100 000 次迭代添加一次打印,您要查找的数字约为 7000-ish,您可以估计从 600851475143 迭代到 7000 需要多长时间。
-
程序的编写方式:它可能还没有达到最大质数。最大的素数是
6857。因此,您需要运行超过 6000 亿次“isprime”检查。其中,循环遍历整个数字。 -
您的代码对于 'c' 的变量/值和中断来说过于复杂。只需将 c 放在一起并放入 return 0 而不是 break。除此之外,您只需要探测除以其他较小的素数,直到所讨论的数字的平方根。
-
我建议更改检查顺序,模数比
isprime快。 (一旦你找到一个除数,你也可以“减少”n)。