我需要一点帮助:
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 谢谢你的帮助!
答案 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
然后从最小的素数开始并向前走,当你到达数字的平方根时停止(如果你还没有找到素数因子)。