红宝石中的阿姆斯特朗数字

时间:2017-11-16 01:46:47

标签: ruby

我对这个练习题有疑问。

  

编写一个Ruby脚本,以显示数字数组中的Armstrong数字。

     

阿姆斯壮的数字是一个数字,其中数字的数字的多维数据集的总和与数字相同。例如,153,370和371是阿姆斯特朗的数字。例如:

153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
     

示例输入

numbers = [123, 124, 153, 370, 234, 23, 45]
     

然后输出

There are 2 Armstrong numbers in the list.

我的代码如下:

def get
  number = [123, 124, 153, 370, 234, 23, 45]
  s = number.count{}
  new_num = number
  sum = 0

  while new_num > 0
    sum = sum + (new_num % 10) * (new_num % 10) * (new_num % 10)
    new_num = new_num / 10
    number.count(new_num)
  end

  if sum == number
    puts "There are #{s} Armstrong"
  end
end

它没有输出,我不知道为什么。

3 个答案:

答案 0 :(得分:2)

如前所述,您可以使用digits。与reduce一起使用时,您可以编写如下内容:

number.select { |n| n.digits.reduce(0) { |m, n| m + n**3 } == n }
 #=> [153, 370] 

答案 1 :(得分:1)

如果必须经常使用该方法,可以通过定义一个保持first so-many Armstrong numbers的集合(而不是数组,以便更快查找)的常量来节省时间。例如,

require 'set'

FIRST_ARMSTRONG_NUMBERS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634,
   8208, 9474, 54748, 92727, 93084, 548834, 1741725, 4210818, 9800817, 9926315,
   24678050, 24678051, 88593477, 146511208, 472335975, 534494836, 912985153,
   4679307774, 32164049650, 32164049651].to_set
     #=> #<Set: {1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208,
     #           9474, 54748, 92727, 93084, 548834, 1741725, 4210818,
     #           9800817, 9926315, 24678050, 24678051, 88593477, 146511208,
     #           472335975, 534494836, 912985153, 4679307774, 32164049650,
     #           32164049651}>
MAX_FIRST_ARMSTRONG_NUMBERS = FIRST_ARMSTRONG_NUMBERS.max
  #=> 32164049651

def count_armstrong_numbers(arr)
  arr.count do |n|
    if n <= MAX_FIRST_ARMSTRONG_NUMBERS
      FIRST_ARMSTRONG_NUMBERS.include?(n)
    else
      n.digits.sum { |d| d**3 } == n
    end
  end
end

答案 2 :(得分:0)

另一种使用最新红宝石版本的解决方案

  def armstrong?(number)
    number.digits.sum { |x| x**number.digits.size } == number 
  end