Java Prime分解:程序超时?

时间:2013-05-21 00:59:56

标签: java timeout factorization

在我因不遵守规则而遭到抨击之前,我无法利用搜索功能,看到这个确切的问题有多个线程。但是,他们都没有回答我的具体问题。

我正在研究欧拉问题#3,我需要找到600851475143的最高素因子。我不需要帮助解决问题。我做了一个强力方法(可能会更好,我知道)解决它。

对于我用较小数字(7位数字以下)进行的所有测试,程序正确返回。但是,当我输入600851475143作为长输入时,我的程序永远不会给我一个回报。我的号码是否太大了?是什么导致这种情况发生?我原本以为是因为我使用的是int标签而不是长标签,但更改这些标签并没有改变我的结果。

我确信这很简单,我很想念它,但我很好奇发生了什么。提前谢谢你:)

//Euler 3: Largest Prime Factor
import java.io.*;
import java.util.Scanner;
import java.lang.Math;


public class Euler3 
{
    public static void main(String[] args)
    {
        Scanner scn = new Scanner(System.in);

        System.out.println("Enter a number!");
        // Create scanner
        long numberInput=scn.nextLong();
        //Can't have a factor higher than it's square root
        double limit=Math.floor(Math.sqrt(numberInput));
        // System.out.println(limit);

        //Start testing from the highest number possible
        for(long i=(numberInput-1);i>0; i--)
        {
            if(numberInput%i==0) 
                System.out.println(i+" is prime: "+isPrime(i));

        }

    } //End Main


    public static boolean isPrime(long n) 
    {
        //check if n is a multiple of 2
        if (n%2==0) return false;
        //if not, then just check the odds
        for(int i=3;i*i<=n;i+=2)
        {
            if(n%i==0)
                return false;
        }
        return true;
    }
}   

3 个答案:

答案 0 :(得分:0)

要验证号码是否为Prime,请使用Sieve of Eratosthenes,与您的原始isPrime方法相比,它的运行速度要快得多。由于这句话,我不会提供任何实施提示:我不需要帮助解决问题

此外,还有其他提示你错过了。我建议你查看问题陈述:

  

什么是最大素数因子

答案 1 :(得分:0)

long变量可以easily fit您想要的值

  

long:long数据类型是64位带符号的二进制补码整数。它的最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807(含)。当需要比int提供的值范围更宽的值时,请使用此数据类型。

问题在于您的算法效率不高。如前所述,使用Sieve of Eratosthenes

答案 2 :(得分:0)

问题不在isPrime方法中,而是在用于调用它的循环中。您的数字n以1为增量进行倒计时,并且仅针对isPrime的除数调用n:在获得第一个潜力之前,您需要n/2个步骤n的除数 - 所以,按照示例n的10 ^ 12步的顺序。