了解代码问题

时间:2014-05-22 19:05:52

标签: java

我正在做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);
}

1 个答案:

答案 0 :(得分:2)

让我们看一下Problem 3 of Project Euler的文字:

  

13195的主要因素是5,7,13和29。

     

600851475143号码的最大主要因素是什么?

了解这一点,首先要了解的主要因素是:

  1. 他们必须是素数。
  2. 1不是主要因素。
  3. 另外,数字的最大因子不能高于其平方根。

    通过了解这些数据,我们可以开始研究我们的算法。目前的解决方案提出了这个建议:

    //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,然后检查因子是否为素数。第一个主要因素是期望的答案。