java - 没有获得简单 java 程序的输出来找到最大素因数

标签 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 。我编译了它,没有出现任何错误。但我没有得到任何输出。原因是什么?

最佳答案

它正在工作(例如,只需在循环内添加一个打印方法来检查 i )。
您当前正在使用暴力破解方法:
http://www.mathblog.dk/project-euler-problem-3/

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

我对此没有太多了解的情况下看到的问题是
您当前所做的操作太多了。
您将值“600851475143”存储在长数据类型中,并且您尝试
使用 int i(for 循环中的计数器)达到一半 (300425737571,5)。

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

这告诉我们:“一个常量保存 int 可以具有的最大值,

2^(31)-1." = 2147483647

这只是您实际需要的0,00715 (0,7%)
所以这导致我们“溢出”。

考虑使用替代方法(第一个链接)
并将 for 循环的计数器更改为“long”。

关于java - 没有获得简单 java 程序的输出来找到最大素因数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44371605/

相关文章:

java - 如何通过swt中的停止按钮停止TestNG的java线程

java - 什么是 NullPointerException,我该如何解决?

java - 如何使用 for 简化逻辑检查数组记录中的所有单元格是否为空

java - Spring中的抽象方法错误

java - JAXB 解码错误后文件被阻止的文件

java - 在Java中读取大文件,太慢并且超出了gc开销限制

java - Android 错误 : java.net.SocketException:套接字已关闭

java - 为什么 @Transactional 在抛出 NullPointerException 后不回滚?

java - 线程和按钮 : How to restart the program after its finished running

java - 需要查找一个数组中的重复数字并将其存储在另一个数组中,但不知道如何将重复数字放入另一个数组中