高精度乘法哦吼吼
作者:互联网
废话不多说,直接上代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<iomanip> using namespace std; int main() { char a1[2001],b1[2001];//用来存放输入的数 int a[2001]={},b[2001]={},c[200001]={},lena,lenb,lenc,i,j,x; scanf("%s",a1); scanf("%s",b1);//输入两个数a,b,用字符的形式存储 lena=strlen(a1);lenb=strlen(b1);//存放a和b的长度; for(i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48;//将char类型转化为int类型存储 for(i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48;//(从后往前方便进位) for(i=1;i<=lena;i++) { x=0;//x用来存储进位,每次循环要清零 for(j=1;j<=lenb;j++) { c[i+j-1]=a[i]*b[i]+x+c[i+j-1]; x=c[i+j-1]/10;//进位 c[i+j-1]%=10;//实际数(不一定是最终的) } c[i+lenb]=x;//当j循环完毕时,将进位传递到下一个i } lenc=lena+lenb; while(c[lenc]==0&&lenc>1) lenc--; for(i=lenc;i>=1;i--)//注意前面是倒序输入的,这里也要倒序输出; cout<<c[i]; cout<<endl; //结束喽 }
注意核心算法
for(i=1;i<=lena;i++) { x=0;//x用来存储进位,每次循环要清零 for(j=1;j<=lenb;j++) { c[i+j-1]=a[i]*b[i]+x+c[i+j-1]; x=c[i+j-1]/10;//进位 c[i+j-1]%=10;//实际数(不一定是最终的) } c[i+lenb]=x;//当j循环完毕时,将进位传递到下一个i }
原理:
a2 a1
X b2 b1
_________________________________________
a1*b1
a1*b2
a2*b1
a2*b2
__________________________________________
按位相加
标签:lenc,高精度,吼吼,a1,2001,b1,b2,include,乘法 来源: https://www.cnblogs.com/lcezych/p/10464105.html