1. 程式人生 > >【分治演算法】大整數乘法

【分治演算法】大整數乘法

大整數的乘法

       在計算機中,長整形(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驗證:
這裡寫圖片描述
結果是一樣的