2017-01-28 1 views
0

J'essaie de créer un programme qui prendra une entrée de deux entiers de taille 10 et moins, qui compte le nombre d'opérations de report résultant de la somme des entiers d'entrée.Erreur lors de l'augmentation de la taille de la valeur de tableau 1 erreur

Par exemple:

Exemple d'entrée:

Exemple de sortie:

La ligne qui renvoie une erreur dans mon programme est la suivante:

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

Là j'essaye d'ajouter 1 à la valeur actuellement dans la position de tableau suivante.

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 

Quand je cours, je reçois le message d'erreur suivant:

test5.ruby: 42: dans block in <main>': undefined method + » pour nil: NilClass (NoMethodError) de test5.ruby: 29: dans downto' from test5.ruby:29:in

Quelqu'un peut-il m'aider? :)

+0

quelle erreur vous avez obtenu? – mic4ael

+0

message d'erreur j'obtenir: test5.ruby: 42: dans 'bloc dans

': méthode définie' +' pour nil: NilClass (NoMethodError) \t de test5.ruby: 29: dans 'downto » \t de test5.ruby :
pugs

+1

Je suppose qu'il y a une approche plus simple dans l'ensemble, mais pour votre problème particulier: l'indice le plus élevé dans le tableau est '10', non? Dans ce cas, quand 'i' est 10,' parta [i + 1] '(sur le côté droit) est' nil', car il n'y a aucun élément dans le tableau avec cet index. Lorsque vous essayez d'incrémenter 'nil', vous obtenez une erreur. Ne devrait-il pas être 'parta [i-1] = parta [i-1] + 1' de toute façon? – Max

Répondre

0

Expansion mon commentaire dans un peu plus longue réponse:

Je soupçonne qu'il ya une approche plus simple dans l'ensemble, mais pour votre problème particulier: l'indice le plus élevé dans le tableau est 10. Dans ce cas, lorsque i est 10, parta[i+1] (sur le côté droit) est nil, car il n'y a aucun élément dans le tableau avec cet index. Lorsque vous essayez d'incrémenter nil, vous obtenez une erreur. Mais il devrait être parta[i-1] = parta[i-1] + 1 de toute façon si vous essayez d'aller de droite à gauche. Cela provoquera un comportement étrange lorsque i est 0, mais vous pourriez ne pas en tenir compte.

0

Le problème est sur cette ligne

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

En cas i == size of the array l'expression i + 1 retournera nil ce qui provoque l'erreur.

0

Juste pour le plaisir, voici la version réécrite avec Ruby 2.4 (pour 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