我想找到可以无提示(完美除法)除以前20个数字(1、2、3 ... 20)的最小数字。
我尝试了一些我认为不会失败的事情,就像这样:
for (int i = 20; i < Integer.MAX_VALUE; i++) {
int seImparte = 0;
for (int j = 1; j <= 20; j++) {
if (i % j != 0) {
seImparte++;
}
}
if (seImparte == 0) {
System.out.println(i);
break;
}
}
我以为我会得到第一个数字,然后程序会退出,但是它运行了,没有任何反应。
感谢您的时间和帮助!
答案 0 :(得分:2)
@raulGLD您的代码可以正常运行,但没有运行时间,
条件无效后,您可以中断内循环
另外,您可以从3或7开始,因为[1,2,3,4,5,6可以由[4,6,8,10,12]测试
-这是可选的,但中断很重要
for (int i = 20; i < Integer.MAX_VALUE; i++) {
int seImparte = 0;
for (int j = 7; j <= 20; j++) {
if (i % j != 0) {
seImparte++; break;
}
}
if (seImparte == 0) {
System.out.println(i);
break;
}
}
输出:232792560
答案 1 :(得分:1)
代替简单的蛮力方法,值得使用简单的数学规则。
针对“大量”的结果,复杂度为O(n*log(n))
Python代码使用Least common multiple函数
def gcd(a, b):
while b > 0:
a, b = b, a % b
return a
def lcm(a, b):
return a * b // gcd(a, b) # integer division
d = 1
for i in range(2, 21): #last i=20
d = lcm(d, i)
print(d)
>>[Dbg]>>> 232792560
我们还可以将范围内所有数字分解为质数,并记住每个质数的最大幂。在这种情况下:2:4; 3:2; 5:1; 7:1; 11:1; 13:1; 17:1; 19:1
并乘以这些幂。更复杂的代码(但是这种方式有时可能有用)
232792560 = 16 * 9 * 5 * 7 * 11 * 13 * 17 * 19
答案 2 :(得分:0)
希望这就是您正在寻找的东西
for (int i = 2; i < Integer.MAX_VALUE; i++) {
for (int j = 2; j <= 20; j++) {
if (i % j == 0) {
System.out.println("i : "+i+" j : "+j);
break;
}
}
}