2012-09-18 3 views
3

J'ai le problème suivant. Supposons que j'ai aux tableaux X et Y dont les entrées se composent de nombres entiers dans la gamme de 0 à 9 commeAjout de tableaux de chiffres comme s'ils représentaient des nombres

X = [1 2 3] 
Y = [7 0 9] 

Je veux penser de ces réseaux comme étant les chiffres de base 10 numéros, de sorte que X représente le numéro 123 et Y représente le nombre 709. Je veux écrire un programme qui sort les chiffres de la somme de ces entiers. Ainsi, dans l'exemple donné, il doit envoyer le tableau

Z = [8 3 2] 

depuis 123 + 709 = 832. Pour des raisons de cette question, il suffit de supposer que X et Y ont la même longueur, à savoir que les chiffres qu'ils représentent avoir le même nombre de chiffres. Pendant que je fais cela, je veux aussi garder une trace des portées qui ont été effectuées lors de l'addition. Ainsi, dans l'exemple, je veux aussi à la sortie

C = [0 0 1] 

ce qui représente que je devais porter un 1 quand j'ai ajouté les chiffres 9 + 3 = 12, mais que les additions des chiffres dans d'autres postes sont allés à travers sans porte. Donc, ma question principale est

  • Est-ce que quelqu'un connaît un moyen simple d'atteindre cet objectif en utilisant MATLAB?

Jusqu'à présent, ce que je suis venu avec est le code suivant qui est donné les deux nombres que X et Y

clear all; clc; 

C = zeros(1, length(X)); 
for j=length(X):-1:1 
    if X(j) + Y(j) > 9 
     C(j) = 1; 
    end 
    Z(j) = mod(X(j) + Y(j), 10); 
    if j < length(X) 
     if Z(j) + C(j+1) < 9 
      Z(j) = Z(j) + C(j+1); 
     else 
      Z(j) = mod(Z(j) + C(j+1), 10); 
      C(j) = 1; 
     end 
    end 
end 

if C(1) == 1 
    Z = [1 Z]; 
end 

Z 
C 

Le problème est que le code ne fonctionne que parfois. Par exemple, il n'a aucun problème à travailler à travers l'exemple que j'ai donné plus haut, que 123 + 709 = 832 avec un "carry array" de [0 0 1]. Mais l'entrée X = 52514 et Y = 41525 ne donne pas les bons résultats. Donc ma question de suivi est

  • Quelqu'un voit-il le bogue dans le code ci-dessus/comment puis-je le corriger?

Répondre

2

Vous devez changer la ligne

if Z(j) + C(j+1) < 9 

à

if Z(j) + C(j+1) <= 9 

Ensuite, cela devrait fonctionner.

+0

Bien sûr. Fonctionne parfaitement. Merci! –

0

Vous pouvez profiter de dec2base, str2num et num2str fonctions:

function StackOverflow 
    x = [1 2 3]; 
    y = [4 5 6]; 

    numX = DigitsToNum(x); 
    numY = DigitsToNum(y); 

    digits = NumToDigits(numX+numY); 
    disp(digits); 
end 

function digits = NumToDigits(x) 
    digits = double(dec2base(x,10) - '0'); 
end 

function num = DigitsToNum(x) 
    st = strrep(num2str(x),' ',''); 
    num = str2num(st); %#ok<ST2NM> 
end 

Une autre façon de mettre en œuvre les deux fonctions ci-dessus:

function digits = NumToDigits(x) 
    digits = []; 
    while x > 0 
     digits(end+1) = mod(x,10); %#ok<AGROW> 
     x = floor(x/10); 
    end 
end 

function num = DigitsToNum(x) 
    baseMult = power(10,0: (numel(x)-1)); 
    num = sum(baseMult.*x); 
end 
+0

Merci pour le conseil. Comment pourrais-je suivre le portage dans ce cas? Malheureusement, cette partie de la sortie est importante pour ce que je fais, pas seulement pour ajouter les tableaux. –

Questions connexes