如何在C中找到最大的素数因子600851475143?

时间:2015-05-28 19:54:43

标签: c project

我尝试使用下面给出的代码找到最大的素数因子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;
}

3 个答案:

答案 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代码。