在打oj时,总会有些数字大小超过范围,但又要对其进行陈发运算,如100位乘以100位,对于已有的数据类型不足以支持运算,这时就要借助字符串来进行运算
#include <iostream>
#include <cstring>
#define N 10000
using namespace std;
void multi (char*a, char* b, int len1, int len2)
{
int dm;
int num1[N]={0};
int num2[N]={0};
int ans[2*N]={0},i,j; //num1,num2储存两个乘数,ans存储结果
for (i=0; i<len1; i++) num1[i]=a[len1-i-1]-'0'; //将字符变数字
for (j=0; j<len2; j++) num2[j]=b[len2-j-1]-'0';
for (i=0; i<len1; i++)
{
dm=0; //需要进位的位数
for (j=0; j<len2; j++)
{
//i+j 是应为第i位数乘以第j位数,其结果会在第i+j位数上体现。
//如100*10时,两个1相乘时,i=2,j=1,结果个位数位1,在第3位。
ans[i+j]+=num1[i]*num2[j];
ans[i+j]+=dm; //加上进位数
dm=ans[i+j]/10; //保留进位数
ans[i+j]%=10; //保留该数的个位数(即在该位上的数)
}
ans[i+len2]+=dm; //每遍循环后的进位
}
int index=len1+len2; //理想中最大位数
while (index>0 && ans[index]==0) index--; //除去前面的0
for (i=index; i>=0; i--) cout<<ans[i];
cout<<endl;
}
char a[N],b[N];
int main(int argc, char** argv) {
cin>>a; cin>>b;
int len1=strlen(a);
int len2=strlen(b);
multi(a,b,len1,len2);
return 0;
}