最大的素因子java

时间:2013-12-28 08:38:43

标签: java primes prime-factoring

我需要一点帮助:

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 谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

您似乎正在寻找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毫秒。)

答案 1 :(得分:0)

如果要多次调用此方法,可以通过构建素数列表来优化搜索。见Eratosthenes筛选:

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

然后从最小的素数开始并向前走,当你到达数字的平方根时停止(如果你还没有找到素数因子)。