C/C++中存在精度问题,很难做到大整数的加法和乘法操作,这里给出大整数的模拟乘法运算。
模拟原理:
模拟每一个位的值进行相乘,并使其加到对应的位置上,最后保证每一位的数都小于10,即从尾到头扫描一遍进位即可。
主要代码:
k=(mx-i)+(mbx-j);//相乘后的位置
c[k-1]+=sum%10;
c[k]+=sum/10;
for(t=1;t<=k;++t){//保证每一位上的数都小于10
if(c[t]>=10){
//cout<<c[t]<<” “;
c[t+1]+=c[t]/10;
c[t]=c[t]%10;
}
}
已测试代码:
/**
*字符串模拟大整数相乘
*/
#include<iostream>
#include<string>
#include<memory.h>
using namespace std;
int c[1001];
int main()
{
string a,b;
while(cin>>a>>b){
//memset(c,0,sizeof(c));
for(int i=0;i<=1000;i++) c[i]=0;
int mx=a.size();
int mbx=b.size();
int ma=mx-1;
int mb=mbx-1;
int k,t;
for(int i=ma;i>=0;–i){
for(int j=mb;j>=0;–j){
int sum=(b[j]-‘0’)*(a[i]-‘0’);
//cout<<sum<<endl;
k=(mx-i)+(mbx-j);
c[k-1]+=sum%10;
c[k]+=sum/10;
}
}
if(!c[k]) –k;
for(t=1;t<=k;++t){
if(c[t]>=10){
//cout<<c[t]<<” “;
c[t+1]+=c[t]/10;
c[t]=c[t]%10;
}
}
if(c[t+1]) k=t+1;
for(t=k;t>=1;t–){
cout<<c[t];
}
cout<<endl;
}
return 0;
}