首页 > 代码库 > 字符串+数组模拟大整数乘法

字符串+数组模拟大整数乘法

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;
}


字符串+数组模拟大整数乘法