Ruby 所有可能的产品
我想找出两个三位数的乘积。当我在小范围内工作时,我能够在短时间内获得输出,但当范围较大时,似乎需要很长时间。有没有办法缩短获得结果的时间 我正在研究的问题是: “回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文数为9009=91×99 查找由两个3位数字的乘积构成的最大回文。”Ruby 所有可能的产品,ruby,Ruby,我想找出两个三位数的乘积。当我在小范围内工作时,我能够在短时间内获得输出,但当范围较大时,似乎需要很长时间。有没有办法缩短获得结果的时间 我正在研究的问题是: “回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文数为9009=91×99 查找由两个3位数字的乘积构成的最大回文。” 这将分别计算100x101和101x100,尽管它们不会被推送到数组中,因为它们已经在数组中了 我的数学不好,但也许每次x上升,y的最小范围都会上升,因为刚才用的是那个?数学比较好的人可以告诉我这是否会开始丢
这将分别计算100x101和101x100,尽管它们不会被推送到数组中,因为它们已经在数组中了 我的数学不好,但也许每次x上升,y的最小范围都会上升,因为刚才用的是那个?数学比较好的人可以告诉我这是否会开始丢失数字
z= 100
for x in 100..999
for y in z..999
num = (x * y)
unless a.include? num
a.push num
end
z = z+1
end
end
我认为这样做可能会使“除非a.include?num”行变得不必要。您真正想做的是什么,即最初的问题是什么,为什么需要所有这些产品
你把每一张都打印出来了吗?有人问你每一个的具体清单吗
如果没有,可能有更好的方法来解决这个问题。例如,如果您只想检查数字X是否是“该产品列表”中的一个元素,那么您所要做的就是:
range = 100..999
range.any? { |i| range.include?(x / i) }
查看代码,可以进行的快速优化是使用集合而不是数组来存储已计算的产品 由于
a
是一个数组,a.include?(num)
必须在返回真/假之前遍历整个元素列表
如果a
是一个集合,a.include?(num)
将在次线性时间内返回
例如:
require 'set'
a = Set.new
for x in 100..999
for y in 100..999
num = (x * y)
unless a.include? num
a.add(num)
end
end
end
puts a.to_a.join(", ")
此外,集合的一个很好的特性是它只存储唯一的元素,因此以下内容是等效的:
require 'set'
a = Set.new
for x in 100..999
for y in 100..999
num = (x * y)
a.add(num)
end
end
puts a.to_a.join(", ")
我想是量子计算吧。“真的长”有多长?有关
x
和y
的值是什么?另请参见(实际上不是重复的,但应该有您的答案)。x的值范围是从100到999。y值的范围是从100到999。我希望在一分钟内得到结果。这个问题似乎离题了,因为它属于打开状态。如果你的问题是查找最大回文,你应该从999开始向下搜索。这是原始问题:回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=91×99。查找由两个3位数字的乘积构成的最大回文。“那么是的,肯定有一种更聪明的方法可以做到这一点。首先,您正在创建和存储每个产品的阵列。你能想出一种方法,一次只验证一个产品的回文性,而不需要存储整个产品列表吗?此外,既然你在寻找“最大回文”,为什么不从999向后搜索到100?事实上,你可能只需要做999到900,看看是否有回文。为了检查产品的回文性,我试图将整数转换成字符串,将字符串一分为二,然后检查前半部分是否与后半部分的相反部分匹配。如果字符串的长度是偶数的,我可以均匀地分割它,但是如果字符串的长度是奇数,我会把元素放在中间,并检查上半部是否与下半部的倒数匹配。而且,因为我在使用for循环,所以我无法在999..100中为x执行操作。另外,我猜最大的回文数应该在900到999之间(或者在上面的某个地方),但我不想假设太多。检查字符串回文性的一个更简单的方法就是my_string==my_string。相反
这太完美了!我刚开始自学ruby,还没有读过关于“set”的书。非常感谢你!
require 'set'
a = Set.new
for x in 100..999
for y in 100..999
num = (x * y)
a.add(num)
end
end
puts a.to_a.join(", ")