我正在做Euler项目而我遇到问题3.经过2个小时试图制作一个java程序是徒劳的,我搜索了答案,但我无法理解一些事情。对不起,如果我问愚蠢的问题,但我是菜鸟,我真的想学习。
public static void main(String[] args) {
long x = 600851475143L;
long biggest = 0L;
for (long i = 2L; i <= x; i++) { // <- HERE, WHY 2L and NOT 1L ?
for (long l = 1L; l <= Math.sqrt(i); l++) { // <- HERE, why Math.sqrt(i) ?????
if (l % i == 0) {
break;
} else {
while (x % i == 0) {
x = x / i; // <- Why x/i ???
biggest = i;
}
}
}
}
System.out.println(biggest);
}
答案 0 :(得分:2)
让我们看一下Problem 3 of Project Euler的文字:
13195的主要因素是5,7,13和29。
600851475143号码的最大主要因素是什么?
了解这一点,首先要了解的主要因素是:
另外,数字的最大因子不能高于其平方根。
通过了解这些数据,我们可以开始研究我们的算法。目前的解决方案提出了这个建议:
//i are the possible factors for the number
for (long i = 2L; i <= x; i++) { // <- HERE, WHY 2L and NOT 1L ?
//answer: because 1 is not the first possible prime factor, is 2
for (long l = 1L; l <= Math.sqrt(i); l++) { // <- HERE, why Math.sqrt(i) ?????
//answer: the largest factor of a number cannot be higher than its square root
if (l % i == 0) {
break;
} else {
while (x % i == 0) {
x = x / i; // <- Why x/i ???
//if i is a factor of x, mark it as the current biggest factor
biggest = i;
}
}
}
}
请注意,600851475143的平方根为775146.09922 ...,向下舍入为775146,这意味着您可以将问题改为:低于775146的最大素数是600851475143? 。有了这个,您可以尝试其他算法来获得上述问题的答案。
一个更好的解决方案是将因子600851475143从775146开始下降到2,然后检查因子是否为素数。第一个主要因素是期望的答案。