主代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main(){ char al[101],bl[101]; int a[101],b[101],c[10001],lena,lenb,lenc,i,j,x;//所有需要的东西 memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c));//这三行为清零操作(memset) scanf("%s",al);//输入第一个乘数 scanf("%s",bl);//第二个 lena=strlen(al); lenb=strlen(bl);//计算两个乘数的位数 for(i=0;i<=lena-1;i++)a[lena-i]=al[i]-48;//利用ascll码性质,0的ascll码为48.减去零就是ascll减去48,成功将字符转化为数字 for(i=0;i<=lenb-1;i++)b[lenb-i]=bl[i]-48;//同上 for(i=1;i<=lena;i++)//根据乘法竖式原理:12——第一行,对应外层for
// * 12——第二行,对应内层for
// _____
// 4
// 2
// 2
// 1
` // _____
// 144 { x=0; for(j=1;j<=lenb;j++) { c[i+j-1]=a[i]*b[j]+x+c[i+j-1];//核心算法,两个数每一位分别相乘再加上x(上一位的进位) x=c[i+j-1]/10; c[i+j-1]%=10; } c[i+lenb]=x;//确定进位 } lenc=lena+lenb; while(c[lenc]==0&&lenc>1)//如果最高为上为零,lenc减一,消去 lenc--; for(i=lenc;i>=1;i--)//此for用来一位一位倒序输出 cout<<c[i]; cout<<endl; return 0; }
更精简明了的高精模板:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define ll long long #define re register using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } char k[2003]; int lena,lenb,lenc,a[2003],b[2003],c[4019]; int main() { cin>>k; lena=strlen(k); for(int i=1;i<=lena;i++) a[i]=k[lena-i]-'0'; memset(k,0,sizeof(k)); cin>>k; lenb=strlen(k); for(int i=1;i<=lenb;i++) b[i]=k[lenb-i]-'0'; for(int i=1;i<=lena;i++) for(int j=1;j<=lenb;j++) { c[i+j-1]+=a[i]*b[j]; } for(int i=1;i<=lena+lenb;i++) { if(c[i]>9) { c[i+1]+=c[i]/10;c[i]%=10; } } lenc=lena+lenb; while(c[lenc]==0&&lenc>1)lenc--; for(int i=lenc;i>=1;i--) printf("%d",c[i]); return 0; }