找到最大的素数因子?

时间:2012-01-25 09:27:28

标签: c

我需要找到 13195的主要因素是5,7,13和29。 / *最大是377. * / 600851475143的最大主要因素是什么?

#include<stdio.h>
int main()
{
    int i, j = 0;
    /*Code works really fine for 13195 or 26*/
    long value, large = 600851475143 /*13195*/;

    for(value = (large - 1) ; value >= 3; value--)
    {
        if(large % value == 0)
        {
            /*printf("I am here \n");*/
            if((value % 2 != 0) && (value % 3 != 0) && (value % 5 != 0) && (value % 7 != 0) )   
            {
                j = 1;
                break;
            }
        }
    }

    if (j == 1)
    {
        printf("%ld", value);
    }
    return 0; 
}

哪里出错?

7 个答案:

答案 0 :(得分:3)

  1. 600851475143太大,无法容纳32位整数。您的计算机上long可能是32位。您需要使用64位类型。确切的数据类型将取决于您的平台,编译器。

  2. 您的主要检查代码是错误的。你假设如果事情没有被2,3,5,7分开那么那就是素数。

答案 1 :(得分:3)

这里最重要的一点是你的代码太慢了:即使你修复了其他问题,例如为你的整数使用了错误的数据类型,并尝试了一些绝对不是素数的除数,迭代一个低于10 ^ 11 将无法完成计算机的生命周期非常浪费。

我强烈推荐你read through the example on page 35 of this classic book,Dijkstra带你完成编写打印前1000个素数的程序的过程。这个例子应该为你提供足够的数学直觉来加速你自己的计算,包括你从你试图考虑的数字的平方根开始搜索的部分。

答案 2 :(得分:2)

600851475143可能高于平台long数据类型的精度。它需要至少40位才能存储。您可以使用它来计算出您有多少位:

#include <limits.h>

printf("my compiler uses %u bits for the long data type\n", (unsigned int) (CHAR_BIT * sizeof (long)));

答案 3 :(得分:1)

#include<stdio.h>
//Euler problem #3
int main(){
    long long i, sqi;
    long long value, large = 600851475143LL;
    long long max = 0LL;

    i   = 2LL;
    sqi = 4LL; //i*i
    for(value = large; sqi <= value ; sqi +=  2LL * i++ + 1LL){
        while(value % i == 0LL){
            value /= (max=i);
        }
    }

    if(value != 1LL && value != large){
        max = value;
    }
    if(max == 0LL){
        max = large;
    }
    printf("%lld\n", max);
    return 0; 
}

答案 4 :(得分:0)

您需要将L后缀添加到溢出MAX INT的数字中,所以这一行:

long value, large = 600851475143;

应该是:

long value, large = 600851475143L;
//                              ^

答案 5 :(得分:0)

为了做到这一点,你需要确定该值是素数 - 即没有素因子。

现在你的小段代码检查3/5/7只是不够好 - 你需要检查值是否有任何较低的素因子(例如11/13/17)。

从战略角度来看,如果你想使用这个分析,你需要查看你到目前为止找到的每个素数因子的列表,并在检查前3个素数时检查它们。

更简单(但效率更低)的方法是编写一个IsPrimeFunction()并检查每个除数的素数并存储最大的除数。

答案 6 :(得分:0)

public class LargeFactor{

     public static void main(String []args){
     long num = 600851475143L;
     long largestFact = 0;
     long[] factors = new long[2];

    for (long i = 2; i * i < num; i++) {
         if (num % i == 0) { // It is a divisor
        factors[0] = i;
        factors[1] = num / i;

        for (int k = 0; k < 2; k++) {
            boolean isPrime = true;
            for (long j = 2; j * j <  factors[k]; j++) {
                if (factors[k] % j == 0) {
                    isPrime = false;
                    break;
                 }
             }
             if (isPrime && factors[k] > largestFact) {
                largestFact = factors[k];
             }
            }
        }
     }
     System.out.println(largestFact);
}
}

以上代码利用了这样一个事实:我们只需要在查找因素时检查所有数字,直到平方根