废话不多说, 直接上代码
- #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
- __________________________________________
按位相加
来源: http://www.bubuko.com/infodetail-2974297.html