【发布时间】:2014-11-26 05:10:04
【问题描述】:
我正在开发一个程序,该程序需要我读入并验证一个数字,但在此过程中,我需要取一个两位整数(例如,我们会说 18)并将其相加 1 + 8。现在我它是否可以在我进行条件检查是否大于 10 并减去时起作用,但在我看来这是一个丑陋的解决方案,想知道是否有更清洁的方法?
【问题讨论】:
-
您是说要读取一个数字的字符串表示形式并计算该数字最后两位数字的总和吗?如果有,是否保证号码至少有两位数?
我正在开发一个程序,该程序需要我读入并验证一个数字,但在此过程中,我需要取一个两位整数(例如,我们会说 18)并将其相加 1 + 8。现在我它是否可以在我进行条件检查是否大于 10 并减去时起作用,但在我看来这是一个丑陋的解决方案,想知道是否有更清洁的方法?
【问题讨论】:
您可以使用modulo operator n % 10 来获取最右边的数字。例如:
18 % 10
# => 8
9 % 10
# => 9
0 % 10
# => 0
(-123).abs % 10
# => 3
要处理负数,请使用Integer#abs。
编辑
Ruby 2.4 有一个Integer#digits 方法。它会从单位的位置开始将数字作为数组提供给您。如果要添加数字,可以使用Enumerable#sum。
123.digits
# =>[3, 2, 1]
123.digits.first
# => 3
123.digits.sum
# => 6
【讨论】:
要添加数字中的所有数字,您可以使用以下命令:
18.to_s.chars.map(&:to_i).reduce(:+)
它将数字转换为字符串,将其拆分为数字,将每个数字转换为整数并将它们加在一起。
适用于任意长度的数字。
【讨论】:
.chars 而不是.split('')
我会这样做:
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
【讨论】:
对于两位整数,我们至少可以使用另一种方法: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)
【讨论】:
ruby-2.6.0 运行了这个基准测试,我得到了非常不同的结果,至少对于digits 方法是这样。还有为什么数字方法中使用的变量是a 而不是b 与其他所有方法一起使用?
这里有一个有趣的解决方案:
def get_digits(n)
res=[]; i=0;
while 10**i < n
res.push( n/10**i%10 )
i += 1
end
return res
end
【讨论】:
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 大于数字长度,这将起作用,但如果提供负数,则不会起作用
【讨论】: