【分治演算法】大整數乘法
阿新 • • 發佈:2019-02-06
大整數的乘法
在計算機中,長整形(long int)變數的範圍不能超過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驗證:
結果是一樣的