Java 为什么我的程序不打印非常大的数字(在长范围内)?

Java 为什么我的程序不打印非常大的数字(在长范围内)?,java,Java,我写了一个程序来确定输入的最大素因子。除了非常大的数字外,它工作正常。我用“60000000000”试过了,它没有打印任何东西,但它没有终止程序或打印错误。这个数字在一个长的范围内,所以我不知道为什么它不起作用。有什么想法吗 public static void main(String[] args) { Scanner s = new Scanner(System.in); long num = s.nextLong(); //terminated by 0

我写了一个程序来确定输入的最大素因子。除了非常大的数字外,它工作正常。我用“60000000000”试过了,它没有打印任何东西,但它没有终止程序或打印错误。这个数字在一个长的范围内,所以我不知道为什么它不起作用。有什么想法吗

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    long num =  s.nextLong();
    //terminated by 0
    while(num!=0L){
        System.out.println(largestPrimeFactor(num));
        num = s.nextLong();
    }

}
public static boolean isPrime(long n) {
    //check if n is a multiple of 2
    if (n!=2L && n%2L==0L) return false;
    //if not, then just check the odds
    for(long i=3L;i*i<=n;i+=2L) {
        if(n%i==0L)
            return false;
    }
    return true;
}
public static long largestPrimeFactor(long x){
    long max=0L;
    if(x%2L==0L){
        max=2L;
    }
    for(long i = 3L; i<=x; i+=2L){
        if(x%i==0L && isPrime(i)==true){
            max=i;
        } 
    }
    return max;
}
publicstaticvoidmain(字符串[]args){
扫描仪s=新的扫描仪(System.in);
long num=s.nextLong();
//由0终止
while(num!=0L){
System.out.println(最大原始因子(num));
num=s.nextLong();
}
}
公共静态布尔iPrime(长n){
//检查n是否为2的倍数
如果(n!=2L&&n%2L==0L)返回false;
//如果没有,那就检查一下赔率

对于(long i=3L;i*i您的程序不会打印输出,因为它仍在处理中。查找大数的素因子可能需要很长时间。

您的程序不会打印输出,因为它仍在处理中。查找大数的素因子可能需要很长时间。

一些事情

首先,分解成素数在计算上很昂贵,这就是为什么它被用作加密系统基础的一部分

其次,你的算法确实是最慢的。有很多更好的算法。例如,尝试。算法选择在这里非常重要

最后,Java有一个BigInteger类,它有一个非常快速的测试来查看某个东西是否为素数(isProbablePrime())。这个测试是概率性的,因为它以非常高的概率检查某个东西是否为素数,但不能绝对保证。它非常接近于确定,但不是完全确定

BigInteger表示大数(数千位或更多),但如果您想使用素数分解,它是Java的一个好工具。

有几件事

首先,分解成素数在计算上很昂贵,这就是为什么它被用作加密系统基础的一部分

其次,你的算法确实是最慢的。有很多更好的算法。例如,尝试。算法选择在这里非常重要

最后,Java有一个BigInteger类,它有一个非常快速的测试来查看某个东西是否为素数(isProbablePrime())。这个测试是概率性的,因为它以非常高的概率检查某个东西是否为素数,但不能绝对保证。它非常接近于确定,但不是完全确定


你应该用适当的语言(即:C/C++,java)来标记它,这样PPL知道什么语言约束是必须推断的。所以ppl知道他们必须推断哪些语言约束。