【问题标题】:Largest prime factor java [duplicate]最大的素数java [重复]
【发布时间】:2013-12-28 08:38:42
【问题描述】:

我需要一点帮助:

public class BiggestPrimeFactor{
        public static void main(String[] args){
            long biggest=0L;
            for(long i=2L; i<=600851475143L; i++){
                if(600851475143L%i==0){
                    for(int l=1; l<=Math.sqrt(i); l++){
                        if (i%l==0){
                            break;
                        } else{
                            biggest=i;
                        }
                    }
                }
            }
            System.out.println(biggest);
        }
    }//end of BiggestPrimeFactor

我不知道是好是坏,但它占用了太多(半个多小时然后我累了并关闭了命令行)......

你能帮忙吗,或者至少告诉我好不好?

谢谢!

我可以解决它!

这就是它的样子

public class BiggestPrimeFactor{
public static void main(String[] args){
    long x=600851475143L;
    long biggest=0L;
    for(long i=2L; i<=x; i++){
        for(long l=1L; l<=Math.sqrt(i); l++){
            if(l%i==0){
                break;
            } else{
                while(x%i==0){
                    x=x/i;
                    biggest =i;
                }
            }
        }
    }
    System.out.println(biggest);
}

}//BiggestPrimeFactor 结束

而且花费的时间真的很短! =P 感谢您的帮助!

【问题讨论】:

  • 那是一个巨大的loooooooooooooooooooop。
  • @MarounMaroun one loooooooooooop 不会成为问题。 Core i7 reaches 100 gigaFLOPS 所以会在 6 秒 内完成。这是第二个 嵌套 循环,它将 6 秒变成 2-4 天 的预计运行时间。 :)(有趣的是,log(600851475143) ~= 27,与一个月内 30 天相比,因此如果嵌套循环没有提前中断,它将运行 2 个月)。
  • 您需要l 做什么?
  • 我用它来检查i是否是素数
  • 你不需要它。此外,为了保存一个x%i,你需要做很多l%is。

标签: java primes prime-factoring


【解决方案1】:

您似乎正在寻找最大的质因数 600851475143。

一旦你找到了一个质因数,你应该反复用它来除目标数。只有完成此操作后,您才能继续检查进一步的候选因素。这将大大减少您的代码必须执行的工作量。

例如,一旦您确定 600851475143 可以被 71 整除,请将 600851475143 替换为 600851475143 / 71 = 8462696833 等等。

此外,一旦以这种方式找到一个因子,它就会自动被认为是素数。不需要单独的素性测试(HT @Henry 指出这一点)。

以下是相关算法的伪代码实现:

n = 600851475143
k = 2
m = None
while n > 1:
  while n % k == 0:
    m = k
    n = n // k               # integer division
  k = k + 2 if k > 2 else 3  # 2, 3, 5, 7, 9, ...
print(m)

(这个伪代码恰好是有效的 Python,在我的计算机上需要 35 毫秒。)

【讨论】:

  • 此外,一旦以这种方式找到一个因子,很明显它是素数。无需单独测试素性。
  • @Henry:确实。很好的评论,谢谢!
  • 感谢您的帮助!
【解决方案2】:

如果你要多次调用这个方法,你可以通过建立一个素数列表来优化你的搜索。参见埃拉托色尼筛法:

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

然后从最小的质数开始,向上移动并在达到数字的平方根时停止(如果您还没有找到质数因子)。

【讨论】:

猜你喜欢
  • 2019-11-23
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
相关资源
最近更新 更多