• 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)%逆序显示
    

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

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

    只能存储有限的位数。

      

      

  • 相关阅读:
    JavaScript完整总结
    vue引入iframe的父子页面的数据传递
    随笔开发中笔记
    关于表格(table)的操作
    es6--6.字符串相关
    ES6--5.数组4个新增方法
    ES6--4.解构赋值
    sublime 远程连接服务器编辑
    ajaxSubmit
    修改 debian 时区
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/7803492.html
Copyright © 2020-2023  润新知