我今天早些时候正在进行一项练习,它涉及将给定整数中的所有数字相加。其中一个数字有下划线。
我决定尝试不使用正则表达式来捕获数字。相反,我只是将整数转换为字符串,使用each_char循环来获取每个char,并在转换为整数时将其推送到新数组。
然而,它似乎忽略了下划线(也许,正确地说是这样)。也许我错误地想到了这一点,但我的理解是下划线不是整数。
因此,在推送/转换过程中,Ruby是否在某处抛出了一个无声错误,这使得它忽略了下划线并继续畅通无阻?如果是这样,有没有办法捕获并查看此错误?
这是我正在谈论的代码。
def summed_digits2(int)
num_arr = []
int.to_s.each_char {|x| num_arr.push(x.to_i)}
num_arr.reduce(:+)
end
puts summed_digits2(123_456_789)
答案 0 :(得分:3)
'123_456_789'
是一个包含数字和下划线的字符串。您可以使用regex
或字符串处理函数忽略下划线并仅处理数字相似的字符。
123_456_789
是一个数字。它与123456789
相同。它也与0x75bcd15
相同。它的价值是相同的,即使它是以不同的方式写的。它也可以使用Roman numerals编写,但其值仍为123456789
(Ruby解析器不了解罗马数字。这里使用的语句只是为了强调这个想法。)
数字中没有下划线,因为数字不是字符串。它是an amount, a quantity, a concept,无论它是如何写在纸上或计算机程序中的。
回到你的问题,让我们注意"数字的总和"取决于数字的表示方式。大多数时候它是使用通常的10个基础编写的,这就是我们在这里使用它的方式。
有许多方法可以计算给定数字的位数之和。我最喜欢的:
123_456_789.to_s.chars.map(&:to_i).inject(:+)
工作原理:
123_456_789 # this is a number: 123456789
.to_s # convert to string: "123456789"
.chars # split to an array of chars: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
.map(&:to_i) # convert each array item to number: [1, 2, 3, 4, 5, 6, 7, 8, 9]
.inject(:+) # "inject" the addition operator ("+") between the items and compute: 45
答案 1 :(得分:2)
下划线只是开发人员的一个便利,基础数字没有下划线。
锻炼的简单解决方案
def summed_digits2(int)
int.to_s.chars.map(&:to_i).inject(:+)
end
答案 2 :(得分:2)
其他答案都很好。我只是指出ruby 2.4带来了Integer#digits
和Enumerable#sum
。
123_456_789.digits # => [9, 8, 7, 6, 5, 4, 3, 2, 1]
123_456_789.digits.sum # => 45