Ruby 欧拉计划#368(数学公式)
在Project Euler中,要求我编写一个程序,从调和序列中找出20项的收敛值:Ruby 欧拉计划#368(数学公式),ruby,math,calculus,Ruby,Math,Calculus,在Project Euler中,要求我编写一个程序,从调和序列中找出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,我不得不阅读有关分歧/收敛的内容。所有
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,我不得不阅读有关分歧/收敛的内容。所有的解释都涉及可以用公式表示的系列。就我所知,这一系列的故事是不可能的
因此,问题是:
有没有一个公式来表示这个级数,或者有没有一种方法可以在没有公式的情况下求出这个级数的收敛性?如果你仔细阅读这个问题,你会注意到实际上有一个公式。您正在处理的序列是一个谐波序列,从中删除了具有3个或更多相等连续数字的项。这里的蛮力方法是求和调和级数的所有项,忽略指定项,直到达到要求的精度。Ruby及其
Rational
类似乎真的很适合这个问题。解决这个问题的简单而粗暴的方法是,编写一个循环,迭代序列的分母,并将分母的倒数添加到一个总和中,因为问题描述中所述的限制并不排除它
大纲与此类似:
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
以防有人认为这是野蛮的强迫: 在这里,蛮力方法将无法在合理的时间内完成,就像在大多数高编号的Project Euler问题中一样 假设你的电脑每秒能处理109个数字(实际上它能处理的数字要少得多)。将
n>9
的有效期限加总到10n大约需要10n-9秒
你需要走多远才能确定小数点后十位的总和
足够远,所有较大有效期限的总和小于10-10。1012足够远吗?不。考虑下千个数字从
1001001001001
其中无效数字为
1001001001110
1001001001111
1001001001112
...
1001001001119
1001001001222
1001001001333
1001001001444
...
1001001001999
1001001002000
这是19,所以有981个有效数字,对应的和大于981/1001000,大于9*10-10。沿着这些思路进行的进一步推理表明,你必须使用远高于1015的暴力——事实上,在剩余有效期限的总和小于10-10之前,你必须超过102000
从宇宙之初开始的野蛮力量还远不能找到可靠的答案。属于对软件开发概念性问题感兴趣的专业程序员的问答。请注意,实际任务与您所说的不同。你需要找到一个调和级数的收敛点,从中去掉这20个元素。很突出,我把“找到级数收敛到的值”这句话误读了,因为它是关于去掉的20个项,而不是没有这20个项的剩余级数。基于此,我找到了一篇由THOMAS SCHMELZER和ROBERT BAILLIE撰写的题为“求奇异、缓慢收敛的调和子级数之和”的文章,这篇文章似乎解决了我的问题。谢谢McHL请记住,如果超过1200个初始条款,您可能实际上需要删除更多条款。您需要给出10位小数位的答案,所以您需要不断求和,直到差值小于10^(-10),这就是Project Euler的全部内容:)+1漂亮的答案。托马斯·施梅尔泽在这里。。。