没有得到简单的java程序的输出,以找到最大的素数因素

时间:2017-06-05 14:48:33

标签: java

class LargestPrimeFactor{
    public static void main(String args[]){
        long p=0L;
        long n=600851475143L;
        for(long i=2L;i<(n/2);i++){
            if((BigInteger.valueOf(i)).isProbablePrime(1)){
                if(n%i==0){
                    p=i;
                }
            }
        }
        System.out.println(p);
    }
}

它是problem 3 from Project Euler。我编译它并没有出现任何错误。但我没有得到任何输出。是什么原因?

4 个答案:

答案 0 :(得分:1)

它正在工作(只需在循环中添加一个打印方法来检查我) 您目前正在使用Brute-Force方法:
http://www.mathblog.dk/project-euler-problem-3/

如果您访问该链接,该人会告诉您替代解决方案。

我在没有太多了解这个问题的情况下看到的问题是 您目前所做的操作太多了 你得到了价值&#34; 600851475143&#34;存储在long数据类型中,并尝试
使用int i(for-loop中的计数器)到达一半(300425737571,5)。

https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#MAX_VALUE

这告诉我们:&#34;一个保持int可以具有的最大值的常量,

2^(31)-1." = 2147483647

这只是你实际需要的0,00715 (0,7%) 因此,这会导致我们进入&#34;溢出&#34;
考虑使用替代方法(第一个链接)
并将你的for循环的计数器改为&#34; long&#34;。

答案 1 :(得分:0)

int最大值为2147483647,小于600851475143/2

当索引i达到最大值时,它将回绕并以负数开头(-2147483648)

你应该使你的索引成为一个很长的值

答案 2 :(得分:0)

<强> EDITED

int数据类型可以存储最多2,147,483,647的值。要存储超出该数字的数字,请使用long

long n = 600851475143L;

不是600851475143 L,因为L之前的一个空格导致系统没有注册它。

此外,for循环中的int i应为long i

答案 3 :(得分:0)

在第二次循环中有一个无限循环,只有在循环结束前添加日志记录时才能看到它。这并不是因为它没有打印这个值,当你盯着控制台时,迭代器仍在盘旋6857。

尝试使用下面的额外日志记录运行代码。

public static void main(String args[]) {
    int p = 0;
    long n = 600851475143L;
    for (int i = 2; i < (n / 2); i++) {
        if ((BigInteger.valueOf(i)).isProbablePrime(1)) {
            if (BigInteger.valueOf(n % i).compareTo(BigInteger.valueOf(0)) == 0) {
                p = i;
                System.out.println("Check == true Iteration"+p);
            }
            System.err.println("Second iterator"+p);
        }
    }
    System.out.println("Final Value of P: "+p);
}