欢迎光临散文网 会员登陆 & 注册

高精度乘法(详细解答)

2022-05-03 11:26 作者:游侠翻滚  | 我要投稿

/*

目前信息技术邻域啊高进度运算越来越普遍,但是又非常难啊。

现在up来温习一下高进度运算,试一试蛤,顺便来帮助大家理解一下

up打字辛苦给给一个免费的赞吧,求你们了,谢谢!

话不多说,直接开始 

*/ 


//注意,高精度乘法无法适用于负数相乘 

#include <cstdio>

#include <cstring>

#include <iostream>

#include <algorithm>

using namespace std;

const int maxn=209;

char x[maxn],y[maxn];

int a[maxn],b[maxn],c[2*maxn];

int main()

{

cin>>x>>y;//输入想要运算的两个数 

int len1=strlen(x),len2=strlen(y);//分别记录x,y的长度到len1与len2 

//初始化a,b,c的值 

memset(a,0,sizeof a); 

memset(b,0,sizeof b);

memset(c,0,sizeof c);

    //把x,y数组中的每一位的数字在0~9之间的序号记录到 a,b数组(即把每一个数字记录到a,b数字里) 

//比如:7在ASCII码中是55,0在ASCII码中是48,所以7的序号应该是55-48=7,再把7记录到a,b数组。 

    for(int i=len1-1,j=0; i>=0; i--,j++) a[j]=x[i]-'0';

    for(int i=len2-1,j=0; i>=0; i--,j++) b[j]=y[i]-'0';

    //各个位于各个位相乘(核心) 

    //注意!这里的每一个位数可能大于10,所以我们还有下面的程序管理进位 

    for(int i=0; i<len1; i++)              //a数组的每一个数字循环一遍 

    for(int j=0; j<len2; j++)              //b数组的每一个数字循环一遍 

            c[i+j]+=a[i]*b[j];                 //相乘结果记录到c数组里 

    int i;

    for(i=0; i<2*maxn; i++)                //循环2*maxn遍,把每一个位数都循环一遍 

    {

        c[i+1]+=c[i]/10;//前面那个位需要加后面那一位的进位数,如:3(23)转化成(3+1)(23%10)=42 

        c[i]%=10;//后面那个数是原先的取余10,同上面的例子 

    }

    //输出答案 

    int k=2*maxn;//一共的位数 

    while(c[k]==0) k--;//把每一个位数都循环一遍,保证没有遗漏 

    if(k<0) cout<<"0";//如果运算2个数是0*0,那么k会直接变成负数,导致无法输出,有了这个就会让程序输出0了。 

    else    

    for(i=k;i>=0; i--)//输出每一位的位数 

        cout<<c[i];

    return 0;

}

/*

总结:

输入字符通过-'0'将其转化成数字并存储到其他的数组里再用循环把他们挨个相乘

注意:这里的乘是乘数的各个位乘乘数的各个位

如果有进位的话,那么把进位的数存储给前面的结果,这里就是c[i+1]+=c[i]/10,存完以后当前位数就变成了c[i]%=10;

保存完以后就循环输出答案就好了 

*/ 

高精度乘法(详细解答)的评论 (共 条)

分享到微博请遵守国家法律