我试图找到小于 1000 的数字,该数字除以 1 时会产生最长的重复数字串。我有一个十进制数字列表,必须找到具有最长重复序列的数字。
这是我到目前为止所拥有的
numbers = [*2..999]
decimal_representations = numbers.map { |number| 1.to_f/number }
decimal_representations.map!(&:to_s)
我可以使用正则表达式生成三维数组。正则表达式/(.+)\1+/
产生重复子字符串的数组。我想找到最长的子串,所以我使用了 enumerable 的max_by
功能。
decimal_representations.map! { |decimal| decimal.scan(/(.+)\1+/).max_by(&:length) }.flatten
我必须压缩数组才能删除nil
元素
decimal_representations.compact!
然后我可以找出哪个长度最长。
decimal_representations.max_by(&:length)
I get 0090009009
,但我无法弄清楚哪个数字具有该十进制值,因为我从数组中删除了 nil 元素。
有任何想法吗?
Float
无法精确表示大多数十进制数字,因此使用(1.to_f/number).to_s
可能不会给你预期的结果。这意味着你的整个算法是不正确的。
你需要一个不同的算法。这是一个提示:1.0 / 7
在数学中产生一个小数0.142857142857...
,重复序列为142857
。如果你使用这个除法,你会注意到142857
是一个除数999999
,这并非巧合。
是 的倍数的数字2
or 5
需要一些额外的注意。诀窍是,例如,14
(7 * 2
) or 35
(7 * 5
),它们中具有相同数量的重复序列1.0 / n
十进制表示法。
如果没有代码来解释这个想法有点困难。我已经解决了这个项目欧拉问题 https://projecteuler.net/problem=26,但希望你能解决它而不看我的源代码 https://github.com/yuhao600/project-euler/blob/master/src/026.%20Reciprocal%20cycles/026.rb first.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)