高精度乘法
【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高精度正整数M和N。 【输出】 求这两个高精度数的积。 【输入样例】 36 3 【输出样例】 108
#include<iostream> #include<cstring> #include<string> using namespace std; char s1[256],s2[256]; int a[256],b[256],c[256]; int main() { cin>>s1; cin>>s2; int lena,lenb,i,j,lenc; lena=strlen(s1); lenb=strlen(s2); for(i=0;i<=lena;i++) //将字符串转换为数字逆序存入数组中 a[lena-i]=s1[i]-'0'; for(i=0;i<=lenb;i++) b[lenb-i]=s2[i]-'0'; for(i=1;i<=lenb;i++) //外层循环当做乘数;双层循环跑起来,不仅次次进位,还把乘数相加起来进位(相当于列竖式数字相加) { int x=0; //用来进位的,外循环结束一遍后进位x要归零处理 for(j=1;j<=lena;j++) //内存循环跑乘法,也要注意进位 { c[i+j-1]=c[i+j-1]+x+a[j]*b[i]; //此位=此位加上进的位x+ab乘积 x=c[i+j-1]/10; //进前位,所以除以10 c[i+j-1]=c[i+j-1]%10; //对10取余,留下本位的 } c[i+lena]=x; //内层循环跑完(b乘完了a的各个位),x应进到下一位 } lenc=lena+lenb; while((c[lenc]==0)&&(lenc>1)) //去掉前导零 lenc--; for(i=lenc;i>=1;i--) //逆序输出c数组 cout<<c[i]; cout<<endl; return 0; }
大数用字符数组输入,将各个数位转化为数值存入数组中;双层循环中的乘法是反过来乘的;