3

我有以下问题。假设我必须数组 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

问题是代码有时只能工作。例如,通过我上面给出的示例,123 + 709 = 832 与 [0 0 1] 的“进位数组”一起工作没有问题。但是输入 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

您可以利用dec2base,str2numnum2str功能:

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