高精度乘法(详细解答)
/*
目前信息技术邻域啊高进度运算越来越普遍,但是又非常难啊。
现在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;
保存完以后就循环输出答案就好了
*/