3

次の問題があります。次のように、エントリが 0 から 9 の範囲の整数で構成される配列 X と Y が必要だとします。

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

これらの配列を 10 進数の数字として考えたいので、X は数字の 123 を表し、Y は数字の 709 を表します。これらの整数の合計の数字を出力するプログラムを書きたいと思います。したがって、与えられた例では、配列を出力する必要があります

Z = [8 3 2]

123 + 709 = 832 からです。この質問のためには、X と Y が同じ長さ、つまり、それらが表す数値の桁数が同じであると仮定するだけで十分です。これを行っている間、追加中に実行されたキャリーも追跡したいと思います。したがって、この例では、出力もしたいと思います

C = [0 0 1]

これは、数字 9 + 3 = 12 を追加したときに 1 をキャリーする必要があったことを表していますが、他の桁の数字の追加はキャリーなしで行われたことを表しています。だから私の主な質問は

  • MATLAB を使用してこの目標を達成する簡単な方法を知っている人はいますか?

これまでのところ、私が思いついたのは、XとYとして2つの数字が与えられた次のコードです

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

問題は、コードが時々しか機能しないことです。たとえば、[0 0 1] の「キャリー配列」で 123 + 709 = 832 という上記の例を問題なく処理できます。しかし、入力 X = 52514 および Y = 41525 では正しい結果が得られません。だから私のフォローアップの質問は

  • 上記のコードにバグが見られる人はいますか?どうすれば修正できますか?
4

2 に答える 2

2

行を変更する必要があります

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

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

その後、動作するはずです。

于 2012-09-18T10:32:10.760 に答える
0

dec2basestr2numおよびnum2str機能を利用できます。

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

上記の2つの機能を実装する別の方法:

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
于 2012-09-18T10:00:17.710 に答える