我尝试使用下面给出的代码找到最大的素数因子600851475143 但是,此代码不返回任何输出,甚至不返回错误或警告。
我哪里出错了?
代码:
#include<stdio.h>
int main()
{
int i,j,k,mpf;
for (i=1;i<600851475143;i++)
{
if(600851475143%i==0)
{
k=0;
for(j=1;j<=i;j++)
{
if(i%j==0)
{
k++;
}
}
if(k==2)
{
mpf=i;
}
}
}
printf("\nThe largest prime factor of 600851475143 is: %ld\n",mpf);
return 0;
}
答案 0 :(得分:-1)
循环高达6000亿将永远 - 不仅是很长一段时间,而且不可能因为它超出int
中可存储的数量(通常最多2 ^ 31-1)这些天,但根据C标准,可能只有2 ^ 15-1。
您需要的是更智能的算法。我建议您不要逐字地给出解决方案,而是建议existing answers查看C中的解决方案。
答案 1 :(得分:-1)
而不是从1循环到600851475143,你应该从2循环到600851475143的平方根:
long long num=600851475143;
long i=2;
while(i<=sqrt(num))
{
//printf("%lu\n",num);
if(num%i==0)
{
while(num%i==0)
{
num/=i;
}
if(num==1)
{
num=i;
break;
}
}
else
{
i++;
}
}
printf("%lu",num);
答案 2 :(得分:-1)
有趣。由于INT_MAX
可能小于600851475143
,递增i
将永远不会达到/超过600851475143
- &gt;无限循环。请务必使用支持所需范围的整数类型。
// infinite loop with 32-bit `int`
int i;
for (i = 1; i < 600851475143; i++) {
推荐在代码中注释的更改。
#include<math.h>
#include<stdio.h>
int main(void) {
//int i, j, k, mpf;
unsigned long i, j, k, mpf = 0;
// 600851475143 is likely outside range of `int`,
// better to treat it as an `unsigned long long`
// no need to try values > sqrt(600851475143)
//for (i = 1; i < 600851475143u; i++) {
unsigned long maxi = (unsigned long) ceil(sqrtl(600851475143u));
for (i = 1; i <= maxi; i++) {
if (600851475143u % i == 0) {
k = 0;
for (j = 1; j <= i; j++) {
if (i % j == 0) {
k++;
}
}
if (k == 2) {
mpf = i;
}
}
}
// Use matching specifiers: Notice the mis-match long int
// printf("\nThe largest prime factor of 600851475143 is: %ld\n", mpf);
printf("\nThe largest prime factor of 600851475143 is: %lu\n", mpf);
return 0;
}
OP的其他改进:从最大的候选除数开始,然后降到1.找到第一个因子后,退出循环。删除k
代码。