在Project Euler中,a problem要求我编写一个程序,以便从谐波序列中找到20个项的收敛值:
1/111, 1/222, 1/333, 1/444, 1/555, 1/666, 1/777, 1/888, 1/999, 1/1000, 1/1110, 1/1111, 1/1112, 1/1113, 1/1114, 1/1115, 1/1116, 1/1117, 1/1118, and 1/1119
我想自己编写程序来解决这个问题,然而,没有处理过Calc II,我不得不阅读Divergence / Convergence。所有解释都涉及可以用公式表示的系列。据我所知,这个系列不能。
所以,问题是:
是否有表示此系列的公式,或者是否有一种方法可以在没有公式的情况下找到此系列的收敛?
答案 0 :(得分:9)
以防任何人考虑暴力破解:
蛮力方法将在这里,就像大多数编号较高的Project Euler问题一样,不会在合理的时间内完成。
假设您的计算机每秒可以处理10个 9 数字(实际上它可以处理的数量远远少于)。要将n > 9
的有效项加起来为10 n ,需要大约10 n-9 秒。
你需要多远才能确定小数点后十位的总和?
足够远,所有较大有效项的总和小于10 -10 。 10 12 是否足够远?不。考虑来自
的下一千个数字1001001001001
其中的无效数字是
1001001001110
1001001001111
1001001001112
...
1001001001119
1001001001222
1001001001333
1001001001444
...
1001001001999
1001001002000
那些是19,所以有981个有效数字,相应的总和大于981/1001001002000,大于9 * 10 -10 。沿着这些方向进行进一步推理表明,你必须蛮力远高于10 15 - 事实上,你必须超过10 2000 剩余的有效期限小于10 -10 。
在宇宙开始时开始的蛮力甚至还远远不能接近可靠的答案。
答案 1 :(得分:0)
如果你仔细阅读这个问题,你会注意到实际上有一个公式。您正在处理的序列是一个谐波序列,从中删除了具有3个或更多相等连续数字的术语。这里的蛮力方法是对谐波系列的所有项进行求和,省略指定的项,直到达到所需的精度。具有Rational
类的Ruby似乎是非常好的候选者。
答案 2 :(得分:0)
针对这个问题的天真和蛮力方法是编写循环迭代系列的分母,并将分母的倒数加到总和中,因为它不会被问题描述中规定的限制排除。
大纲与此类似:
for i in (1..1200)
if is_valid(i) then
sum += 1.0 / i
end
end
def is_valid(_i)
# implement the check here. hint: use modulo operator ;-)
end