Project Euler程序5在Java中花费的时间太多

Project Euler程序5在Java中花费的时间太多,java,Java,问题是: 能被1到20的所有数整除的最小正数是多少 我编写了下面的程序,它给出了正确的输出,但是执行起来花了很长时间 我能做些什么来加快我的程序 public class ep5 { public static void main(String[] args) { int n=100,k=0; boolean check=true; while(check) { k=0; n++; for

问题是: 能被1到20的所有数整除的最小正数是多少

我编写了下面的程序,它给出了正确的输出,但是执行起来花了很长时间

我能做些什么来加快我的程序

    public class ep5 {

    public static void main(String[] args) {

    int n=100,k=0;
    boolean check=true;
    while(check)
    {   
        k=0;
        n++;

        for (int i=2;i<21;i++)
            if(n%i!=0)
                k=1;

        if (k!=1)
            check=false;
    }
    System.out.println(n);
}
}
公共类ep5{
公共静态void main(字符串[]args){
int n=100,k=0;
布尔检查=真;
while(检查)
{   
k=0;
n++;

对于(int i=2;i我们可以很容易地看到,将所有数字从1除以20的最小数字是小于20的所有(最大幂次)(小于20的素数)的乘积,您可以设法找到这些数字,并计算出小于20的更大幂次,然后将这些数字相乘


我在数学上所做的是将所有这些数字分解为素数乘积,然后取每个素数的最大幂。

一个开始就是不要除以2的倍数

for (int i=3;i<21;i++){ //begin at i = 3
     i = i + 1; //count by twos
     if(n%2 !=0 && n%i!=0) //add a condition
          k=1;
}

希望这会有帮助。

不要被所有的数字除
2…20
。如果
n
可以被20除,那么它也必须可以被2除。如果你检查
20,19,18,17,16,15,14,13,12,11
而不是
2…20
,你将省去很多开销。你可以通过将n的值乘以ma来减少一些计算x数(20),因为它必须被最大数整除。20,40,60,80100120140…另一个注释…在设置k=1的循环中,将其作为中断条件并退出for循环。{k=1;break;}。k=1之后的所有其他计算都是无意义的。请看一下GCD(最大公分母)的概念两个数字的一个。@rossum我想你指的是LCM(),它在这里更相关。这个问题的答案可以简单地计算为LCM(1,2,3,4,…,18,19,20)这里要小心。只有一个二分之一因子的数字不会被平均分割成20或16这样的数字,其中包含多个二分之一因子。您需要修改您的答案。您的答案意味着正确的答案是2x3x5x7x11x11x13x17x19。但是,这不能被4 8 9 12 16 18或20整除。我删除了最后一条注释,您被删除了好的,我会更正我的答案
if      (n%2 !=0)
     k = 1;
else if (n%3 != 0)
     k = 1;
else if (n%5 != 0)
     k = 1;
else if (n%7 != 0)
     k = 1;
else if (n%11 != 0)
     k = 1;
else if (n%13 != 0)
     k = 1;
else if (n%17 != 0)
     k = 1;
else if (n%19 != 0)
     k = 1;
else 
     check = false;