为什么这不起作用? (ProjectEulerProblem5)

时间:2014-04-27 21:35:16

标签: java

我正在尝试我们的项目Euler,我已经遇到了问题5,这就是问题所在:

从1到20的所有数字均可被整除的最小正数是多少?

这就是我想出来的:

for (int x = 1; x >= 100100100; x++) { //100100100 is just a number to count to, an end point.
    int count = 0;
    for (int b = 1; b <= 20; b++) {
        if (x % b == 0) { //Tests numbers.
            count++; //Counter

            if (count == 20) { //Numbers that fit between 1 and 100100100
                System.out.println(x);
            }
        }
    }
}

当我运行它时,它不会打印值。我做错了什么/被忽视了?

4 个答案:

答案 0 :(得分:2)

从以下位置更改循环:

for (int x = 1; x >= 100100100; x++) {

为:

for (int x = 1; x <= 100100100; x++) {

实际上,你甚至没有进入循环体,因为在初始化值之后你没有验证条件。

答案 1 :(得分:1)

首先,问题的真正要求是找到可以被1到20之间的所有数字整除的最小数字。这意味着您不需要在代码100100100中处理另一个数字。所有你需要做的是找到范围内所有素数的最大幂。在这种情况下它将是

2 ^ 4 * 3 ^ 2 * 5 * 7 * 11 * 13 * 17

答案 2 :(得分:0)

你的最大值很小。你需要以不同的方式解决你的问题,因为暴力需要太长时间(事实上,大多数项目的euler任务都会这样做)这是因为他们中的大多数都是数学挑战而不是真正的编程挑战。

你需要做些什么来计算出这个数字所具有的因素。

2 => must be a multiple of 2
3 => must also be a multiple of 3
4 => must be a multiple of 2 and 2
5 => must be a multiple of 5
6 = > must be a multiple of 2 and 3

从2到6你需要2 * 2 * 3 * 5是满足所有这些或60的最小因素。对于2到20你需要考虑它们全部。注意:它将是7,11,13,17和19的倍数。一旦你找到了你需要的因子,

答案 3 :(得分:0)

这不是你问题的答案,因为它已被回答,但我的意见是:

你应该这样做:

boolean flag = true;
if(x % b !=0){        // If one number does not meet the condition
    flag = false;     // A flag tells you the test failed
}

而不是计算每个项目。并且while循环计数到无穷大。

此外,解决方案SPOILER ALERT:对于问题的解决方案,我的方法是使用素数和称为素数分解的东西。