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中运行了几分钟而且它没有返回任何结果。我猜我的代码有大约一百万种方法可以优化;有人能给我一些提示吗?
今天尝试解决一些编程问题,这个问题给我带来了麻烦。
非常感谢:)
答案 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;
}
}
答案 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并且每次都进行模数运算。有许多,而不是复杂的方法可以在瞬间解决多头因素分解。