Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 所有可能的产品_Ruby - Fatal编程技术网

Ruby 所有可能的产品

Ruby 所有可能的产品,ruby,Ruby,我想找出两个三位数的乘积。当我在小范围内工作时,我能够在短时间内获得输出,但当范围较大时,似乎需要很长时间。有没有办法缩短获得结果的时间 我正在研究的问题是: “回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文数为9009=91×99 查找由两个3位数字的乘积构成的最大回文。” 这将分别计算100x101和101x100,尽管它们不会被推送到数组中,因为它们已经在数组中了 我的数学不好,但也许每次x上升,y的最小范围都会上升,因为刚才用的是那个?数学比较好的人可以告诉我这是否会开始丢

我想找出两个三位数的乘积。当我在小范围内工作时,我能够在短时间内获得输出,但当范围较大时,似乎需要很长时间。有没有办法缩短获得结果的时间

我正在研究的问题是:

“回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文数为9009=91×99

查找由两个3位数字的乘积构成的最大回文。”


这将分别计算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(", ")