使用Java查找Long数的素因子

时间:2010-10-23 10:56:50

标签: java prime-factoring

public class prime
{
   public static void main(String[] args)
    {
     long thing = 600851475143L;
     for(long i = 300425737571L ; i == 0 ; i-- ){
     if (thing % i == 0)
     {
       long answer = i;
       System.out.println(answer);
       break;
     }
     }

    }

}

这是我目前拥有的代码,但是我已经在DrJava中运行了几分钟而且它没有返回任何结果。我猜我的代码有大约一百万种方法可以优化;有人能给我一些提示吗?

今天尝试解决一些编程问题,这个问题给我带来了麻烦。

非常感谢:)

3 个答案:

答案 0 :(得分:3)

为了计算不是非常大的值的素因子,生成高达平方根“物”的素数会更有效率,然后逐个尝试。

可以完成素数生成:

答案 1 :(得分:3)

但是你只需要迭代到sqrt(thing)。

一般来说,从2开始迭代会更快,因为一半的数字会有两倍(而1/3则是3等等。

你也只打破第一个因素,所以会错过任何其他因素

 long thing = 600851475143L;
 for(long i = 0; i < 300425737571L ; i++ ){
     if (i * i > thing) {
       break;
     }
     if (thing % i == 0) {
       long answer = i;
       System.out.println(answer);
       break;
     }
 }
  • aioobe说
  • 提供了更复杂的方法

答案 2 :(得分:2)

不,它正在终止,因为

i == 0

不会保留第一次迭代。

你可能想写这样的东西:

public class Test {
    public static void main(String[] args) {
        long thing = 600851475143L;
        for (long i = 16857 /* 300425737571L */; i > 0; i--) {
            if (thing % i == 0) {
                long answer = i;

                // Print the largest prime factor, then break loop (and quit)
                System.out.println(answer);
                break;
            }
        }
    }
}
然而,这种天真的因子分解方法效率极低。由于600851475143的因式分解为71 * 839 * 1471 * 6857,因此您必须从300425737571迭代到6857并且每次都进行模数运算。有许多,而不是复杂的方法可以在瞬间解决多头因素分解。