2017-01-28 2 views
0

Я пытаюсь создать программу, которая будет принимать ввод двух целых чисел размером 10 и ниже, что подсчитывает количество операций переноса в результате суммирования входных целых чисел.Ошибка при увеличении размера массива на 1 ошибка

Например:

Пример ввода:

Пример вывода:

Строка, которая возвращает ошибку в моей программе есть:

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 +»для ноль: NilClass (NoMethodError) из test5.ruby: 29: в downto' from test5.ruby:29:in

Может ли кто-нибудь мне помочь? :)

+0

какая ошибка у вас есть? – mic4ael

+0

Сообщение об ошибке я получаю: test5.ruby: 42: в 'блока в

'не определено методом' +' для ноль: NilClass (NoMethodError) \t из test5.ruby: 29: в' Downto» \t из test5.ruby : 29: in '
pugs

+1

Я подозреваю, что есть более простой подход в целом, но для вашей конкретной проблемы: самый высокий индекс в массиве равен' 10', правильно? В этом случае, когда 'i' равно 10,' parta [i + 1] '(с правой стороны) является' nil', потому что в массиве с этим индексом нет элемента. Когда вы пытаетесь увеличить «nil», вы получите сообщение об ошибке. Разве это не должно быть 'parta [i-1] = parta [i-1] + 1'? – Max

ответ

0

Расширяя свой комментарий в несколько более ответ:

Я подозреваю, что есть более простой подход в целом, но и для вашего конкретного вопроса: самый высокий показатель в массиве 10. В этом случае, когда i равен 10, parta[i+1] (с правой стороны) равен nil, поскольку в массиве с этим индексом нет элемента. Когда вы пытаетесь увеличить значение nil, вы получите сообщение об ошибке. Но в любом случае это должно быть parta[i-1] = parta[i-1] + 1, если вы пытаетесь перейти справа налево. Это приведет к некоторому нечетному поведению, когда i равно 0, но вам это может не понравиться.

0

Проблема заключается в этой строке

parta[i+1] = (parta[i+1] + 1) 

В случае i == size of the array выражение i + 1 вернет nil, который вызывает ошибку.

0

Просто для удовольствия, вот версия переписана с Руби 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 
Смежные вопросы