• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

MATLAB 大数相乘溢出显示

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

解一道面试题——华为社招现场面试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)%逆序显示

同时这段程序还可以计算不同位的大数相乘。

核心思想是字符串表示数字,突破计算机对数字存储位数的限制,然后画整为零,分位计算,最后再转为字符串

只能存储有限的位数。

  

 

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
全栈程序员的新玩具Rust(二)基本代码入门发布时间:2022-07-18
下一篇:
Rust 摄像头(IPC) RTSP 推流发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap