我正在制作一个程序,要求我读入并验证一个数字,但这样做我需要取一个两位数的整数(例如我们说18)并将其加1 + 8。现在我让它在我进行条件检查的地方工作,如果它大于10并减去,但在我看来这是一种丑陋的解决方案,并且想知道是否有更清洁的方法吗?
答案 0 :(得分:10)
您可以使用modulo operator n % 10
。例如:
18 % 10
# => 8
9 % 10
# => 9
0 % 10
# => 0
修改强>
Ruby 2.4有一个Integer#digits方法。所以你可以做到
123.digits.first
# => 3
整数#digits方法将从单位的位置开始给出数字作为数组。如果您想处理负数,请使用Integer#abs
123.digits
# =>[3, 2, 1]
答案 1 :(得分:1)
要添加数字中的所有数字,您可以使用以下内容:
18.to_s.chars.map(&:to_i).reduce(:+)
它将数字转换为字符串,将其拆分为数字,将每个数字转换为整数并将它们全部加在一起。
使用任意长度的数字。
答案 2 :(得分:0)
我就是这样做的:
any_number = 1234
# Ensure your input is at most a two digit number (might not be needed)
two_digit_number = any_number % 100 #=> 34
# Calculate the final addition
total = two_digit_number / 10 + two_digit_number % 10 #=> 7
答案 3 :(得分:0)
对于两位整数,至少可以使用另一种方法:Numeric#divmod
,它返回数组中的商和模数。下面是几种不同的数字求和方法的速度:
b = 18
n = 1_000_000
Benchmark.bmbm do |x|
x.report('to_s:') { n.times { b.to_s.chars.map(&:to_i).reduce(:+) }}
x.report('divmod:') { n.times { b.divmod(10).reduce(:+) }}
x.report('direct division:') { n.times { b/10 + b%10 } }
x.report('digits:') { n.times { a.digits.reduce(:+) } }
end
#####
user system total real
to_s: 0.750000 0.000000 0.750000 ( 0.750700)
divmod: 0.150000 0.000000 0.150000 ( 0.153516)
direct division: 0.080000 0.000000 0.080000 ( 0.076697)
digits: 0.560000 0.020000 0.580000 ( 0.574687)
答案 4 :(得分:0)
这里有一个有趣的实用解决方案:
def get_digits(n)
res=[]; i=0;
while 10**i < n
res.push( n/10**i%10 )
i += 1
end
return res
end
答案 5 :(得分:-1)
def digits_sum(number,n)
number_array=number.to_s.chars
n=[n,number_array.length].min
number_array.slice(-n,n).map {|c| c.to_i }.reduce(:+) || 0
end
此方法返回N个右数位的总和。
digits_sum 123456789,5 => 35
digits_sum 123456789,2 => 17
如果你给N大于数字长度但是如果提供了负数则不会工作
,这将有效