【分治算法】大整数乘法

来源:互联网 发布:郭艾伦奥运会数据 编辑:程序博客网 时间:2024/06/18 11:00
大整数的乘法       在计算机中,长整形(long int)变量的范围是-2147483648能超过10位数。即便用双精度(double)变量,也仅能保证16位有效数字的精度。在某些需要更高精度的乘法运算场合,需要用别的办法来实现运算。 比较容易想到的是做多位数乘法时列竖式进行计算的方法,只要写出模拟这一过程的程序,就能实现任意大整数的乘法运算。经过查阅资料,找到一种更易于编程的方法,即“列表法”。

下面先介绍“列表法”:
例如当计算8765*234时,把乘数和被乘数照如下列出,见表1:

这里写图片描述

源代码:

#include<iostream>#include<string>using namespace std;int main(){    string a;    string b;    cin>>a>>b;    int lena=a.size();    int lenb=b.size();    int* tmp=new int[lena+lenb];    for(int y=0;y<lena+lenb;y++)    {        tmp[y]=0;    }    int* C=new int[lena+lenb];    for(int i=0;i<lenb;i++)    {        for(int j=0;j<lena;j++)        {            tmp[j+i]=tmp[j+i]+(int(b[i])-48)*(int(a[j])-48);        }    }    int ii=0;    for(int k=lena+lenb-2;k>=0;k--)    {        if(tmp[k]>=10 && k>=1)        {            tmp[k-1]=tmp[k-1]+tmp[k]/10;            C[ii]=tmp[k]%10;            ii++;        }        else if(tmp[k]<10 && k>=1)        {            C[ii]=tmp[k];            ii++;        }        else        {            if(tmp[0]>=10)            {                C[ii]=tmp[0]%10;                ii++;                C[ii]=tmp[0]/10;            }            else                C[ii]=tmp[0];        }    }    for(int h=ii;h>=0;h--)    {        cout<<C[h]<<"";    }    return 0;}

输入与输出
这里写图片描述

这里写图片描述

用Python验证:
这里写图片描述
结果是一样的