我有以下问题。假设我必须使用数组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,但是其他位置的数字的添加没有进位。所以我的主要问题是
到目前为止,我提出的是下面的代码,它给出了两个数字: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不会产生正确的结果。所以我的后续问题是
答案 0 :(得分:2)
您需要更改行
if Z(j) + C(j+1) < 9
到
if Z(j) + C(j+1) <= 9
然后它应该工作。
答案 1 :(得分:0)
您可以利用dec2base
,str2num
和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
实现上述两个功能的另一种方法:
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