添加数字数组就好像它们代表数字一样

时间:2012-09-18 09:29:19

标签: arrays matlab math carryflag

我有以下问题。假设我必须使用数组X和Y,其条目由0到9范围内的整数组成,如

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

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

问题是代码有时只能起作用。例如,通过上面给出的示例,使用&#34;进位数组&#34; 123 + 709 = 832,没有问题。 [0 0 1]。但输入X = 52514和Y = 41525不会产生正确的结果。所以我的后续问题是

  • 有没有人在上面的代码中看到错误/我该如何解决?

2 个答案:

答案 0 :(得分:2)

您需要更改行

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

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

然后它应该工作。

答案 1 :(得分:0)

您可以利用dec2basestr2numnum2str功能:

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

实现上述两个功能的另一种方法:

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