大整數乘法

2021-06-12 21:01:02 字數 2375 閱讀 3619

問題描述

by 計算機演算法設計與分析 王曉東 p17

通常,在分析乙個演算法的計算複雜性時,都將加法和乘法運算當作是基本運算來處理,即將執行一次加法或乘法運算所需的計算時間當作乙個僅取決於計算機硬體處理速度的常數。

這個假定僅在計算機硬體能對參加運算的整數直接表示和處理時才是合理的。然而,在某些情況下,我們要處理很大的整數,它無法在計算機硬體能直接表示的範圍內進行處理。若用浮點數來表示它,則只能近似地表示它的大小,計算結果中的有效數字也受到限制。若要精確地表示大整數並在計算結果中要求精確地得到所有位數上的數字,就必須用軟體的方法來實現大整數的算術運算

設x和y都是n位的二進位制整數,現在要計算它們的乘積xy。我們可以用小學所學的方法來設計乙個計算乘積xy的演算法,但是這樣做計算步驟太多,顯得效率較低。如果將每2個1位數的乘法或加法看作一步運算,那麼這種方法要作o

(n2)步運算才能求出乘積xy。下面我們用分治法來設計乙個更有效的大整數乘積演算法。

圖6-3 大整數x和y的分段 

我們將n位的二進位制整數x和y各分為2段,每段的長為n/2位(為簡單起見,假設n是2的冪),如圖6-3所示。

由此,x=a2n/2+b ,y=c2n/2+d。這樣,x和y的乘積為:

xy=(a2n/2+b)(c2n/2+d)=ac2n+(ad+cb)2n/2+bd 

(1)如果按式(1)計算xy,則我們必須進行4次n/2位整數的乘法(ac,ad,bc和bd),

以及3次不超過n位的整數加法(分別對應於式(1)中的加號),此外還要做2次移位(分別對應於式(1)中乘2n

和乘2n/2)。所有這些加法和移位共用o

(n)步運算。

xy=ac2n+[(a-b)(d-c)+ac+bd]2n/2+bd 

(2)雖然,式(2)看起來比式(1)複雜些,但它僅需做3次n/2位整數的乘法(ac,bd和(a-b)(d-c)),6次加、減法和2次移位。

設x=314l,y=5327,用上述演算法計算xy的計算過程可列表如下,其中帶'

號的數值是在計算完成ac,bd,和(a-b)(d-c)之後才填入的。

x=3141 

a=31 

b=41 

a-b=-10

y=5327 

c=53 

d=27 

d-c=-26

ac=(1643)'

bd=(1107)'

(a-b)(d-c)=(260)'

xy=(1643)'104+[(1643)'+(260)'+(1107)']102+(1107)'

=(16732107)'

a=31 

a1=3 

b1=1 

a1-b1=2

c=53 

c1=5 

d1=3 

d1-c1=-2

a1c1=15 

b1d1=3 

(a1-b1)(d1-c1)=-4

ac=1500+(15+3-4)10+3=1643

b=41 

a2=4 

b2=1 

a2-b2=3

d=27 

c2=2 

d2=7 

d2-c2=5

a2c2=8 

b2d2=7 

(a2-b2)(d2-c2)=15

bd=800+(8+7+15)10+7=1107

|a-b|=10 

a3=1 

b3=0 

a3-b3=1

|d-c|=26 

c3=2 

d3=6 

d3-c3=4

a3c3=2 

b3d3=0 

(a3-b3)(d3-c3)=4

(a-b)(d-c)=200+(2+0+4)10+0=260

#define clocks_per_sec 1000

#define length 10

#include

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define number 10000

using namespace std;

void myself()

}int main(void)

這個程式可以完成八位十進位制數與八位十進位制數的乘法計算,再多估計就無法滿足要求;;;

主要的限制在於long型別的整數對乘法結果大小的限制。。。。

大整數乘法

參考 http hi.baidu.com operationsystem blog item 6e45dd1af1acadf3ae51330b.html 在計算機中,長整型 long int 變數的範圍是 2147483648 至 2147483647,因此若用長整型變數做乘法運算,乘積最多不能超過...

大整數乘法。

include using namespace std int multi int num1,int size1,int num2,int size2 int size size1 size2 int ret new int size int i 0 for i 0 iret i 0 for i 0...

大整數乘法

高精度計算需要注意的幾個問題 1.用字串的讀入方式,再按字元分別轉成數字2.不能用數值型的讀入方式 二 計算過程中考慮進製和借位問題 先不急於處理,在計算結束時處理 1.陣列第i元素 10 或 0 需要考慮2.從上位增或減1,本位減或加10三 輸出時注意跳過高位多餘的0四 陣列需要稍微大一些,避免運...