【问题标题】:Ruby - See if a multiple of a number has the exact same digits as the original number (re-arranged)Ruby - 查看一个数字的倍数是否与原始数字具有完全相同的数字(重新排列)
【发布时间】:2014-07-11 02:13:32
【问题描述】:

我有一个号码,想看看我是否将这个号码乘以一个实数,如果新号码的位数与前一个号码完全相同,只是重新排列。例如,如果我想将一个数字乘以 2 并查看数字是否保持不变,我会这样做

125874
=> 251748

251748 是 125874 乘以 2,两个数字具有完全相同的数字,只是重新排列。为简单起见,我现在只用 2 的倍数对其进行测试。这是我尝试做的,但失败了。

x = 125874
array = x.to_s.chars.map{|x|x.to_i}
  => [1,2,5,8,7,4]
array.permutation.include?((x * 2).to_s.chars.map{|x|x.to_i}
  => true

现在,我尝试循环运行此程序,以查找所有 100,000 以下符合此条件的数字。

range = (1..100000).to_a
range.select do |x|
  array = x.to_s.chars.map{|x|x.to_i}
  array.permutation.include?((x * 2).to_s.chars.map{|x|x.to_i}
end
  => []

现在,它应该在该数组中记录了至少 125874,因为 125874 * 2 等于 251748,即 125874 的排列。

我想我设法在这件事上摆脱了自己的困惑。

【问题讨论】:

  • 如果您发现我的答案(截至 8 月 4 日的唯一答案)有帮助,请考虑选择它。

标签: ruby algorithm range permutation digit


【解决方案1】:

首先假设如果给定的数字包含重复的数字,我们要求数字和该数字的乘积与任一数字中出现的每个数字的数字相同:

def same_digits?(nbr, mult)
  nbr.to_s.chars.sort == (nbr * mult).to_s.chars.sort
end

same_digits?(125874,2) #=> true  (125874*2 => 251748)
same_digits?(125874,3) #=> false (125874*3 => 377622)

如果nbrnbr*prod 必须包含相同的数字,但每个数字的位数不一定相同,则方法仅略有不同:

def same_digits?(nbr, mult)
   nbr.to_s.chars.uniq.sort == (nbr * mult).to_s.chars.uniq.sort
end

same_digits?(10255,2) #=> true   (10255*2 => 20510)
same_digits?(10255,3) #=> false  (10255*3 => 30765)

在第二种情况下,有许多其他方法可以确定两个数组在删除重复项后是否包含相同的元素。让:

a = nbr.to_s.chars.uniq
b = (nbr*mult).to_s.chars.uniq

以上我使用a.sort == b.sort 来检查匹配项。以下是其他几种方式:

(a&b)==a && (a&b)==b         # Array intersection

(a-b).empty? && (b-a).empty? # Array difference

require 'set'
a.to_set == b.to_set 

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多