求两个大整数(大于32位)的乘积的C++实现代码

 

求两个大整数(大于32位)的乘积的C++实现代码

//主要思路是两个数组放两个大数,一个数组放各个位相乘的中间结果,一个数组放最后结果

#include <iostream>


using namespace std;

void Multiply()
{
    char num1[50],num2[50];
    char tmp1,tmp2;
    int resultTmp[100],result[100];
    memset(resultTmp,0,100*sizeof(int));
    memset(result,0,100*sizeof(int));

    int i,j,length1=0,length2=0;

//输入两个数,都要以#结尾,数的高位放在数组的低位

    cin>>tmp1;
    for(i=0;tmp1!='#';i++)
    {
        if(tmp1<'0'||tmp1>'9')
        {
            cout<<"error1!"<<endl;
            return ;
        }
        num1[i]=tmp1;
        length1++;
        cin>>tmp1;
    }

    cin>>tmp2;
    for(i=0;tmp2!='#';i++)
    {
        if(tmp2<'0'||tmp2>'9')
        {
            cout<<"error2!"<<endl;
            return ;
        }
        num2[i]=tmp2;
        length2++;
        cin>>tmp2;
    }


//两个数诸位相乘

    for(i=0;i<length1;i++)
    {
        for(j=0;j<length2;j++)

        {

//因为是数的高位放在数组的低位,所以要从数组的高位开始

//乘积低位对齐的两个数放在同一个数组的元素中

            resultTmp[i+j]+=(num1[length1-1-i]-'0')*(num2[length2-1-j]-'0');
        }
    }


//从中间结果数组得到结果

    for(i=0;i<length1+length2;i++)

    {

        int oneBit=resultTmp[i];

//resultTmp[i]的第一位对应到result[i]

//第二位对应到result[i+1]……

        j=i;

//逐位对应过去,求和

        while(oneBit/10!=0)

        {

            result[j]+=(oneBit%10);

//求和过程中需要进位

            if(result[j]>=10)

            {

//进位

                result[j+1]+=result[j]/10;
                result[j]=result[j]%10;
            }
            j++;
            oneBit=oneBit/10;

        }

//最高的一位加到result

        result[j]+=oneBit;
        if(result[j]>=10)
        {
            result[j+1]+=result[j]/10;
            result[j]=result[j]%10;
        }
    }


//得到最高位

    for(i=99;i>=0&&result[i]==0;i--);

//逐位输出

    for(j=i;j>=0;j--)
    {
        cout<<result[j];
    }
    cout<<endl;
    return ;

}

int main()
{
    Multiply();
    return 1;
}

你可能感兴趣的:(C++,c)