我正在尝试创建一个程序,它将输入两个大小为10或更小的整数,它计算输入整数求和后的进位操作量。
例如:
示例输入:
59864417 974709147
示例输出:
6
在我的程序中返回错误的行是:
parta[i+1] = ( parta[i+1] + 1 )
我正在尝试将1添加到当前位于下一个数组位置的值。
run = true
while run == true
#input string
text = gets.chomp
#split string and remove space
parta = text.split[0]
partb = text.split[1]
#convert split strings to integers
partf1 = parta.to_i
partf2 = partb.to_i
#check for terminal input of 0
if partf1 + partf2 <= 0
run = false
end
#fill strings with 0s to size 11
parta = sprintf( "%011i", parta )
partb = sprintf( "%011i", partb )
#convert strings to arrays of integers
parta = parta.split("").map(&:to_i)
partb = partb.split("").map(&:to_i)
count = 0
(10).downto(0) do |i|
if ( parta[i] + partb[i] ) > 9
count = count + 1
parta[i+1] = ( parta[i+1] + 1 )
#59864417 974709147 test input should output 6
end
end
if run == true
puts "#{count} carry operations."
end
end
当我运行时,我收到以下错误消息:
test5.ruby:42:在block in <main>': undefined method
+'中为nil:NilClass(NoMethodError)
来自test5.ruby:29:downto'
from test5.ruby:29:in
有人能帮帮我吗? :)
答案 0 :(得分:0)
问题在于这一行
parta[i+1] = ( parta[i+1] + 1 )
如果i == size of the array
i + 1
,表达式nil
将返回导致错误的Moya
。
答案 1 :(得分:0)
将我的评论扩展为稍长的答案:
我怀疑整体方法更简单,但对于您的特定问题:数组中的最高索引是10
。在这种情况下,当i
为10时,parta[i+1]
(右侧)为nil
,因为数组中没有包含该索引的元素。当您尝试增加nil
时,会出现错误。但是如果你想要从右到左,它应该是parta[i-1] = parta[i-1] + 1
。 <{1}}为0时,这会导致一些奇怪的行为,但您可能并不关心。
答案 2 :(得分:0)
只是为了好玩,这里是使用Ruby 2.4重新编写的版本(Intger#digits
):
a = 59_864_417
b = 974_709_147
a, b = [a, b].sort
carry = false
count = b.digits.zip(a.digits).count do |m, n|
r = m + (n || 0) + (carry ? 1 : 0)
carry = r > 9
end
p count
#=> 6