2014-02-22 31 views
-3

这是欧拉项目的第三个问题。什么是600851475143.最大的主要因素是什么。我已经完成了这个程序,但是这个数字是一个12位数字,我不得不把这个数据类型用很长的时间。当我尝试执行小号码的程序(如13195)时,它可以正常工作,但对于所需的号码它不会!我试着在各种编译器上在线运行它,并在我的PC上使用Cygwin。但是这些程序在三次输出后停止前进。时间在执行期间耗尽

帮助!

#include<stdio.h> 
int main() 
{ 
    long long num = 600851475143; 
    int i=1,j,k, big=0; 
    // printf("\nEnter a number:"); 
    //scanf("%d",&num); 
    while(i<=num) 
    { 
     k=0; 
     if(num%i==0) 
     { 
      j = 1; 
      while(j <= i) 
      { 
       if(i % j == 0) 
        k++; 
       j++; 
      } 

      if(k==2) 
      { 
       printf("\n%d is a prime factor",i); 
       if(i > big) 
        big = i; 
      } 
     } 
     i++; 
    } 

    printf("\nBiggest prime factor is %d", big); 
    return 0; 
} 
+0

你能解释一下你的算法?这个问题有一个简单的解决方案,但让我们知道你是如何处理这个问题的。 – rendon

+0

问题是你的算法。你目前的算法是O(N^2),这对于大数量将永远占用的数量而言。这个问题可以用一个循环来解决,而不是两个嵌套的问题。 –

+0

@StevenBurnap我在这个编程中使用了逻辑从somehwere ..我想要求您提供您的逻辑如何在一个循环中做到这一点.. – LearneR

回答

0
#include<stdio.h> 

int main(){ 
    long long num = 600851475143LL; 
    long long i=1;//It must be the same type for num when was the prime. 

    for(i=2;i*i<=num;++i){ 
     while(num % i ==0){ 
      num /= i; 
     } 
    } 
    printf("\nBiggest prime factor is %lld", num == 1 ? i - 1 : num); 
    return 0; 
}