问题 J: 【高精度】高精度乘法
时间限制: 1 Sec 内存限制: 64 MB提交: 34 解决: 17
[提交][状态][讨论版]
题目描述
牢门上的第三道锁,需要使用高精度乘法来破译出相应密码,当然,必须使用“万进制算法”计算两个非负整数A、B的积,其中A和B的位数在10000位以内。
输入
共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A、B的位数均在10000以内。
输出
输出一个数,即A和B的乘积。
样例输入
2
3
样例输出
6
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char a[10001];//储存a,由低位到高位 char b[10001];//储存a,由低位到高位 char c1[10001];//临时存储 char c2[10001];//临时存储 int f[20000]={0};//存放结果,逆序 void cheng(int la,int lb){ int k=0; int ge; int shi; if(la>=lb){ for(int i=0;i<lb;i++){ for(int j=0;j<la;j++){ f[k+j]+=(a[j]-'0')*(b[i]-'0'); } k++; } for(int l=0;l<=(la+lb-1);l++){ if(f[l]>=10){ ge=f[l]%10; shi=f[l]/10; f[l]=ge; f[l+1]+=shi; } } } if(la<lb){ for(int i=0;i<la;i++){ for(int j=0;j<lb;j++){ f[k+j]+=(b[j]-'0')*(a[i]-'0'); } k++; } for(int l=0;l<=(lb+la-1);l++){ if(f[l]>=10){ ge=f[l]%10; shi=f[l]/10; f[l]=ge; f[l+1]+=shi; } } } } void print(int l){ int k=0; for(int j=l;j>=0;j--){ if(f[j]==0){ k++; }else{ break; } } if(k==l+1){ printf("0"); }else{ for(int i=l-k;i>=0;i--){ printf("%d",f[i]); } } } int main() { int la; int lb; while(scanf("%s %s",c1,c2)!=EOF){ la=strlen(c1); for(int i=0;i<la;i++){ a[i]=c1[la-1-i]; } lb=strlen(c2); for(int i=0;i<lb;i++){ b[i]=c2[lb-1-i]; } cheng(la,lb); print(la+lb-1); printf(" "); memset(f,0,20000*sizeof(int)); } return 0; }