最初,我在让这段代码正常运行时遇到了一些问题,但经过一些调整后,我对其进行了调试并准备就绪。
我已经对这个程序进行了几次修改。我从整数值开始,却发现这个数字太大而无法放入 int 中。然后我改用 BigIntegers,这被证明很麻烦,但可行。从那里,我切换到 longs (从一开始就应该这样做)并将我的代码的运行时间缩短 8 倍(或更多)。
这是现在的代码:
long qNum = 600851475143L;
for (long i = qNum - 1L; i * i >= qNum; i -= 2L)
if (qNum % i == 0 && isPrime(i)) {
System.out.println("Solution:" + i); // for debugging
return i;
}
else
System.out.println(i);// for debugging
return 0L;
和
public static boolean isPrime(long num) {
// unnecessary if statement for this problem (b/c of for loop), but useful for others
if (num % 2 == 0)
return false;
for (long i = 3; i * i <= num; i += 2)
if (num % i == 0)
return false;
return true;
}
它已经运行了几个小时,但仍然没有找到任何东西。我在网上看到解决这个难题的典型方法就像解析560GB的数据=/。
有什么加快速度的技巧吗?
非常感谢,
贾斯蒂安
编辑:
优化代码:
public static long greatestPrimeFactor(ArrayList<Long> factors, long num) {
for (long i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
factors.add(i);
return greatestPrimeFactor(factors, num / i);
}
}
for (int i = factors.size()-1; i > 0; i--)
if (isPrime(factors.get(i)))
return num;
return 0;
}
和
public static boolean isPrime(long num) {
if (num % 2 == 0)
return false;
for (long i = 3; i * i <= num; i += 2)
if (num % i == 0)
return false;
return true;
}
运行
greatestPrimeFactor(new ArrayList<Long>(), 600851475143L);