题目
在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263。要想计算更加规模的数,就要用软件来扩展了,比如用数组或字符串来模拟更多规模的数及共运算。
现在输入两个整数,请输出它们的乘积。
输入格式
两行,每行一个正整数,每个整数不超过10000位
输出格式
一行,两个整数的乘积。
注意一点
在做乘法运算时,同样也有进位,同时对每一位进行乘法运算时,必须进行错位相加
直接上代码
#include <iostream>
#include <cstring>
using namespace std;
#define M 10000
#define N 20000//注意数组c存的值是a*b,位数要设为a,b的位数的两倍
int main(int argc, char *argv[]) {
string str1,str2;
cin>>str1>>str2;
int i,j,k=0,q=0,r=0,len=0,len1,len2;
len1=str1.length();
len2=str2.length();
int a[M],b[M],c[N];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=0;i<len1;i++)
a[len1-1-i]=str1[i]-'0'; /*a[len-1]~a[0]*/
for(j=0;j<len2;j++)
b[len2-1-j]=str2[j]-'0';
for(i=0;i<len2;i++){
r=0;/*每开始一轮相乘,进位r重新赋值为0*/
for(j=0;j<len1;j++){
c[k]=b[i]*a[j]+c[k]+r;/*两个数相乘比较特殊,b的个位 乘 a的个位到最高位的结果放入c[0]~c[k];之后b的十位再乘一遍a,得到的结果放入c[1]~c[k]*/
r=c[k]/10;
c[k]=c[k]%10;
k++;
}
len=k;/*i=0,此为b的个位乘一遍a后得到结果c的位数,从c[0]开始记;i=1,此为b的十位乘a后得到结果c的位数,结果存入c[1]至c[k]*/
c[len]=r;/*i=0,b的个位乘a后得到结果c的最高位*/
if(r==0)/*若r=0,即无进位,则给有进位时预留的最高位,减1*/
len--;
k=++q;/*k用于错位相加时指定数组c的下标;若用k=q++;则下一轮的k为0,而不是1; */
}
for(i=len;i>=0;i--)
cout<<c[i];
return 0;
}