Pascal高精度,pascal的高精度演算法

2022-02-15 22:00:43 字數 7197 閱讀 7630

1樓:匿名使用者

開個陣列

每個元素存10進位制的若干位,連起來表示整個數字

要寫得好的話得用高效的演算法,同時控制好記憶體的分配

2樓:匿名使用者

自己拿幾個三位數 四位數 五位數 模擬一下就ok了

想法就是把這些n位數拆成n位慢慢看

3樓:

高精度數的定義:

type

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

1.高精度加法

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

vari, 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);

vari, 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;

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);

vari, 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], c[i] 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)

vari, 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);

vari, 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 (compare(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;

大體思路為開個陣列把大數字截成小數字再處理

要注意的是進位和退位的問題

pascal的高精度演算法

pascal高精度加法程式

4樓:匿名使用者

簡化版高精度加法,還帶解釋......

vars1,s2:string; //定義兩個加數

a,b:array[1..241] of integer; //加數轉換

i,len:integer; //總長度及 for迴圈定義

begin

readln(s1); readln(s2); //讀入兩個加數(字串)

for i:= 1 to length(s1) do a[i]:=ord(s1[length(s1)+1-i])-48; //將字串a轉為陣列

for i:= 1 to length(s2) do b[i]:=ord(s2[length(s2)+1-i])-48; //將字串b轉到陣列

if length(s1)>length(s2) then len:=length(s1) else len:=length(s2); //求出較長加數的長度

for i:=1 to len do

begin //開始加法程式

a[i+1]:=a[i+1]+(a[i]+b[i]) div 10;

a[i]:=(a[i]+b[i]) mod 10; //處理進位

end;

if a[len+1]>0 then len:=len+1; //如果開頭進位,那總長度+1

for i:=len downto 1 do write(a[i]); //輸出相加結果

end.

241位制 不夠還可以改,最多位為 【10(9)-1】

5樓:雪懋東門景輝

輸入兩個長整數(十位以上),輸出它們的和。

varst:string;

x,y:array[0..101]of

integer;

i,j,l1,l2:integer;

begin

write('x=');

readln(st);

l1:=length(st);

fori:=0

to101

dox[i]:=0;

fori:=l1

downto1do

x[l1-i]:=ord(st[i])-ord('0');

write('y=');

readln(st);

l2:=length(st);

fori:=0

to101

doy[i]:=0;

fori:=l2

downto1do

y[l2-i]:=ord(st[i])-ord('0');

ifl1

then

l1:=l2;

fori:=0

tol1

dobegin

x[i]:=x[i]+y[i];

x[i+1]:=x[i+1]+x[i]

div10;

x[i]:=x[i]

mod10;

end;

write('x+y=');

j:=101;

while

x[j]=0

doj:=j-1;

fori:=j

downto0do

write(x[i]);

readln;

end.

例七輸入兩個長整數(十位以上),輸出它們的積。

varst1,st2:string;

x,y:array[1..200]of

integer;

z:array[1..401]of

integer;

i,j,l1,l2,a,b,c,d:integer;

begin

write('x=');

readln(st1);

l1:=length(st1);

fori:=1

to200

dox[i]:=0;

fori:=l1

downto1do

x[l1+1-i]:=ord(st1[i])-ord('0');

write('y=');

readln(st2);

l2:=length(st2);

fori:=1

to200

doy[i]:=0;

fori:=l2

downto1do

y[l2+1-i]:=ord(st2[i])-ord('0');

fori:=1

tol1

dofor

j:=1

tol2

dobegin

a:=x[i]*y[j];

b:=a

div10;

c:=a

mod10;

d:=i+j-1;

z[d]:=z[d]+c;

z[d+1]:=z[d+1]+z[d]

div10+b;

z[d]:=z[d]

mod10;

end;

a:=l1+l2;;

while

z[a]=0

doa:=a-1;

write(st1,』*』,st2,』=『);

fori:=a

downto1do

write(z[i]);

writeln;

readln;

end.

例六輸入兩個長整數(十位以上),輸出它們的差。

varst,st1,st2:string;

x,y,z:array[0..200]ofbyte;

i,k,s1,s2,code:integer;

begin

write('x=');

readln(st1);

s1:=length(st1);

write('y=');

readln(st2);

s2:=length(st2);

write(st1,』-』,st2,』=『);

if(s1

begin

write(『-』);

st:=st1;st1:=st2;st2:=st;

k:=s1;s1:=s2;s2:=k;

end;

fillchar(x,sizeof(x),0);

fillchar(y,sizeof(y),0);

fillchar(z,sizeof(z),0);

fori:=1

tos1

doval(st1[i],x[s1+1-i],code);

fori:=1

tos2

doval(st2[i],y[s2+1-i],code);

fori:=1to

s1do

begin

ifx[i]-y[i]<0

then

begin

x[i+1]:=x[i+1]-1;

x[i]:=x[i]

+10;

end;

z[i]:=x[i]-y[i];

end;

k:=s1;

while

z[k]=0

dok:=k-1;

fori:=k

downto1do

write(z[i]);

writeln;

readln;

end.

pascal程式設計 高精度求積

vara,b,c array 1.100 of longint n1,n2,n ansistring lena,lenb,lenc,i,j,x longint begin readln n i pos n n1 copy n,1,i 1 delete n,1,i n2 n lena length n...

pascal程式設計

你提的問題很多,題目能否講究一下,比如將 狐狸和兔子 放在標題中,以便別人查詢 這不就是狼追兔子的翻版嗎?將1234567890這閉合的十個洞想象成 由這十個數字串一個接一個接起來的無限長的直線vari,j longint k array 0.9 of longint sum longint beg...

pascal 符串的處理,PASCAL 字串的處理

好啊,我是oier哦,這個顯然很簡單。const fuhao kuohao varst,s1 string function ji ch char integer begin case ch of ji 1 ji 1 ji 2 ji 2 ji 3 end end function geti st s...