大数运算(四)——大数相乘

来源:互联网 发布:用指针给数组排序3个数 编辑:程序博客网 时间:2024/05/21 11:18

给定任意长度的数字,数字长度从1到1000位,求两个数字的乘积。

可以用字符串来保存超长数字。

解题思路:

利用乘法公式,将被乘数与乘数的每一位相乘,在乘完一位数后,要注意移位,即在被乘数后面补零。然后将被乘数与乘数每一位相乘的结果相加。

#include<iostream>#include<string>using namespace std;string BigAdd(string a,string b){    string s1,s2;    int i,len1,len2;    if(a.size()>=b.size())    {        s1=a;        s2=b;    }    else    {        s1=b;        s2=a;    }    len1=s1.size();    len2=s2.size();    for(i=len2-1;i>=0;i--)        s1[len1-1-i]=s1[len1-1-i]+s2[len2-1-i]-'0';    for(i=len1-1;i>0;i--)    {        //cout<<s1[i];        while(s1[i]>'9')        {            s1[i]-=10;            s1[i-1]++;        }    }    if(s1[0]>'9')    {        s1[0]-=10;        s1.insert(s1.begin(),'1');    }    //cout<<s1<<endl;    return s1;}void BigMulti(string a,string b){    int len1,len2;    len1=a.size();    len2=b.size();    int n1,n2,flag=0;    string result="0",temp;    for(int i=len2-1; i>=0; i--)    //或者当a.size()<b.size()时交换a,b    {        n2=b[i]-'0';        temp=a+string(len2-1-i,'0');        //cout<<temp<<endl;        for(int j=len1-1; j>=0; j--)        {            n1=a[j]-'0';            //temp[j]=n1*n2+'0';                if(n1*n2+'0'>127)       //防止越界            {                //temp[j]=n1*n2+'0'-10;                temp[j]=n1*n2%10+'0'+flag;                flag=n1*n2/10;            }            else            {                   temp[j]=n1*n2%10+'0'+flag;                flag=n1*n2/10;            }            //cout<<temp<<endl;        }        //cout<<temp<<endl;        if(flag)        {            char c=flag+'0';            temp.insert(temp.begin(),c);            flag=0; //本轮循环结束后归零        }        result=BigAdd(temp,result); //temp的值比result大    }    cout<<result<<endl;}int main(){    string str1,str2;    while(cin>>str1>>str2)        BigMulti(str1,str2);    return 0;}

程序运行结果:

这里写图片描述

0 0