我对这个练习题有疑问。
编写一个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
它没有输出,我不知道为什么。
答案 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