Project Euler程序5在Java中花费的时间太多
问题是: 能被1到20的所有数整除的最小正数是多少 我编写了下面的程序,它给出了正确的输出,但是执行起来花了很长时间 我能做些什么来加快我的程序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
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;