Ruby 为什么赢了';我的代码不能停止运行吗?
我想在欧拉计划中解决这个问题。代码适用于示例,当我检查1到10之间的数字时,结果是2520,这是正确的。但是当我检查从1到20的数字时,代码并没有停止运行 这是:Ruby 为什么赢了';我的代码不能停止运行吗?,ruby,infinite-loop,Ruby,Infinite Loop,我想在欧拉计划中解决这个问题。代码适用于示例,当我检查1到10之间的数字时,结果是2520,这是正确的。但是当我检查从1到20的数字时,代码并没有停止运行 这是: num = 0 while true num += 1 check = true for i in 1..20 break unless check check = num%i==0 end break if check end File.ope
num = 0
while true
num += 1
check = true
for i in 1..20
break unless check
check = num%i==0
end
break if check
end
File.open("__RESULT__.txt", "w+").write num
这个问题的解决方案不能仅仅通过计算每一个可能的解决方案来找到。这个解决方案太大了,需要几天(也许几年)才能计算出来 有一个更聪明的解决方案,使用素数来记下数字 给出的示例(2520是可被数字1到10整除的最小数字)可以这样写:
1 = 1 (can be skipped) = 2^0 * 3^0 * 5^0 * 7^0
2 = 2 (prime) = 2^1 * 3^0 * 5^0 * 7^0
3 = 3 (prime) = 2^0 * 3^1 * 5^0 * 7^0
4 = 2^2 = 2^2 * 3^0 * 5^0 * 7^0
5 = 5 (prime) = 2^0 * 3^0 * 5^1 * 7^0
6 = 2 * 3 = 2^1 * 3^1 * 5^0 * 7^0
7 = 7 (prime) = 2^0 * 3^0 * 5^0 * 7^1
8 = 2^3 = 2^3 * 3^0 * 5^0 * 7^0
9 = 3^2 = 2^0 * 3^2 * 5^0 * 7^0
10= 2 * 5 = 2^1 * 3^0 * 5^1 * 7^0
现在,可以除以这些的最小数,可以通过使用每个素数的最大功率来计算:
2^3 * 3^2 * 5^1 * 7^1 = 2520
可以对数字1到20执行相同的操作(即使是手动操作)
最后提示:答案大于100.000.000,但小于10亿,因此如果进行有效计算,可以在几分钟内计算出答案。问题本质上要求您找到前20个数字的LCM
lcm = 1
for i = 2 to 20
lcm = (i * lcm) / gcd(lcm,i)
一个更简单的解决方案是使用你的算法,但是增加2520,而不是1,这里是我的C++解决方案。
#include <iostream>
using namespace std;
int main()
{
int check = 2520;
int i = 11;
while (i != 20)
{
i ++;
if (check % i != 0)
{
check +=2520;
i = 1;
}
}
cout << check << endl;
return 0;
}
#包括
使用名称空间std;
int main()
{
整数校验=2520;
int i=11;
而(i!=20)
{
i++;
如果(检查%i!=0)
{
支票+=2520;
i=1;
}
}
cout-Marc已经给出了一个完美的答案。或者:因为每个数字都必须被20整除,num+=20
会给你20倍的加速。另外,使用for i in 2..20
因为每个数字都可以被1整除,这是一个风格注释:你的代码可以更习惯地写为inf=1.0/0.0;num=(1..inf)。找到{n |(1.20)。全部?{i ixx%i= 0 }} <代码>但这不会改变太长时间来计算的事实。只是检查了我在Ruby中提出的稍微优化的版本。这里需要大约1分钟,这对项目Euler限制来说是很困难的,比在2秒内同样的C++版本慢得多。谢谢!我是第一次用手工完成的。(阅读了我们的答案后)然后优化了我的代码,现在两种方法都可以了!