基本演算法 高精度計算

2021-03-31 08:56:30 字數 2611 閱讀 5172

五、高精度計算

高精度數的定義:

type

hp=array[1..maxlen] of integer;

1.高精度加法

procedure plus ( a,b:hp; var c:hp);

var i,len:integer;

begin

fillchar(c,sizeof(c),0);

if a[0]>b[0] then len:=a[0] else len:=b[0];

for i:=1 to len do begin

inc(c[i],a[i]+b[i]);

if c[i]>10 then begin dec(c[i],10); inc(c[i+1]); end;

end;

if c[len+1]>0 then inc(len);

c[0]:=len;

end;

2.高精度減法

procedure substract(a,b:hp;var c:hp);

var i,len:integer;

begin

fillchar(c,sizeof(c),0);

if a[0]>b[0] then len:=a[0] else len:=b[0];

for i:=1 to len do begin

inc(c[i],a[i]-b[i]);

if c[i]<0 then begin inc(c[i],10);dec(c[i+1]); end;

while (len>1) and (c[len]=0) do dec(len);

c[0]:=len;

end;

3.高精度乘以低精度

procedure multiply(a:hp;b:longint;var c:hp);

var i,len:integer;

begin

fillchar(c,sizeof(c),0);

len:=a[0];

for i:=1 to len do begin

inc(c[i],a[i]*b);

inc(c[i+1],(a[i]*b) div 10);

c[i]:=c[i] mod 10;

end;

inc(len);

while (c[len]>=10) do begin

c[len+1]:=c[len] div 10;

c[len]:=c[len] mod 10;

inc(len);

end;

while (len>1) and (c[len]=0) do dec(len);

c[0]:=len;

end;

4.高精度乘以高精度

procedure high_multiply(a,b:hp; var c:hp}

var i,j,len:integer;

begin

fillchar(c,sizeof(c),0);

for i:=1 to a[0] do

for j:=1 to b[0] do begin

inc(c[i+j-1],a[i]*b[j]);

inc(c[i+j],c[i+j-1] div 10);

c[i+j-1]:=c[i+j-1] mod 10;

end;

len:=a[0]+b[0]+1;

while (len>1) and (c[len]=0) do dec(len);

c[0]:=len;

end;

5.高精度除以低精度

procedure devide(a:hp;b:longint; var c:hp; var d:longint);

var i,len:integer;

begin

fillchar(c,sizeof(c),0);

len:=a[0]; d:=0;

for i:=len downto 1 do begin

d:=d*10+a[i];

c[i]:=d div b;

d:=d mod b;

end;

while (len>1) and (c[len]=0) then dec(len);

c[0]:=len;

end;

6.高精度除以高精度

procedure high_devide(a,b:hp; var c,d:hp);

vari,len:integer;

begin

fillchar(c,sizeof(c),0);

fillchar(d,sizeof(d),0);

len:=a[0];d[0]:=1;

for i:=len downto 1 do begin

multiply(d,10,d);

d[1]:=a[i];

while(***pare(d,b)>=0) do

begin

subtract(d,b,d);

inc(c[i]);

end;

end;

while(len>1)and(c.s[len]=0) do dec(len);

c.len:=len;

end;

基礎演算法 高精度計算 高精度加法

輸入兩個數到兩個變數中,然後用賦值語句求他們的和,輸出。但是,我們知道,在c 中任何資料型別都有一定表示範圍。當兩個被加數很大時,上述演算法顯然不能求出精確解,因此尋求另外一種方法。在讀小學時,我們做加法都採用豎式方法,這樣,我們可以寫出兩個整數相加的演算法。我們用陣列a b分別儲存加數和被加數,用...

基本演算法之高精度計算c c 實現

void init int a 接收時往往是用字串的,所以它的位數就等於字串的長度。c i a i b i if c i 10 if a i b i c i a i b i i和j從1開始迴圈 c i j 1 a i b i x c i j 1 當前乘積 進位 原數 x c i j 1 10 記錄 ...

基本演算法 高精度計算 大整數相加

求兩個不超過200位的非負整數的和。有兩行,每行是一個不超過200位的非負整數,可能有多餘的前導0。一行,即相加後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。22222222222222222222 33333333333333333333 55555555555...

演算法 高精度計算乘法1(高精度乘單精度)

題目描述 高精度乘單精度,a b。a是一個很大的非負整數,但不超過240位,b是一個非負整數不超過10000,求a b。高精度乘單精度的數學實現 1 2 5 25 25 50 125 諸位進位 3 1 2 512 5 2525 5012531 25實現步驟 1 string s讀入高精度數,int ...

高精度計算

最近做了一些高精度計算問題,一般來說解題辦法都差不多,都是通過字串來操作的,下面是解題模板。清零操作 string clearstr string s if s return s 0 while s.length 0 s 0 0 s.erase 0,1 刪除第一個零 if s return s 0 ...