MATLAB 大數相乘溢出顯示


解一道面試題——華為社招現場面試1:請使用代碼計算1234567891011121314151617181920*2019181716151413121110987654321 。

乘積是逐位相乘,也就是aibj,結果加入到積C的第i+j位,最后處理進位即可,例如:A =17 = 1*10 + 7 = (7,1)最后是十進制的冪表示法,冪次是從低位到高位,以下同。B=25 = 2*10 + 5 = (5, 2);C = A * B = (7 * 5, 1 * 5 + 2 * 7, 1 * 2) = (35, 19, 2) = (5, 22, 2) = (5, 2. 4)=425。

思路為:
(1)轉換並反轉,字符串轉換為數字並將字序反轉;

(2)逐位相乘,結果存放在result_num[i+j]中;

(3)處理進位,消除多余的0;

(4)轉換並反轉,將計算結果轉換為字符串並反轉。

clear all
clear

%% 字符串輸入
a='1234567891011121314151617181920';%將數字輸入成 字符串
b='2019181716151413121110987654321';
a_len=length(a);
b_len=length(b);
A=zeros(1,a_len);%預留空間
B=zeros(1,a_len);
s=zeros(1,a_len+b_len);
S=zeros(1,a_len+b_len);
W=zeros(1,a_len+b_len);
sum_len=a_len+b_len;

%% 字符串轉為數組,並且翻轉字符,個位在前,高位在后
for ii=1:a_len
    A(ii)=str2num(a(a_len+1-ii));  
end
for ii=1:b_len
    B(ii)=str2num(b(b_len+1-ii));
end

%%
%分塊相加
for jj=1:sum_len-1  %積的位數
    n=1;%下標從1開始遍歷
    while (n<=a_len)&(n<jj+1) %下標一方面小於數字的長度,另一方面小於積的第幾位數
        if ((jj+1-n)<=a_len) %因為下標和是一個定值,所以兩個下標都要小於數字長度
            s(jj)=s(jj)+A(n)*B(jj+1-n);%兩個下標和為jj+1的兩個數積之和
        end
        n=n+1;
    end
end

%%
%十位前加,個位留存
 for jj=1:sum_len %S和W可以合並減少存儲空間
     if jj==1
        S(jj)=mod(s(1),10);
        W(jj)=mod(s(1),10);
     else
         S(jj)=s(jj)+floor(S(jj-1)/10);
         W(jj)=mod(S(jj),10);
     end
 end
 
 %% 最高位去零
 if W(end)==0 
     W(end)=[]
 end
 
 %%
 %數字轉字符串
 str=num2str(W);
 str_f=strrep(str, ' ', '');%去除空格
 final=str_f(end:-1:1)%逆序顯示

同時這段程序還可以計算不同位的大數相乘。

核心思想是字符串表示數字,突破計算機對數字存儲位數的限制,然后畫整為零,分位計算,最后再轉為字符串

只能存儲有限的位數。

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM