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. 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... 你提的問題很多,題目能否講究一下,比如將 狐狸和兔子 放在標題中,以便別人查詢 這不就是狼追兔子的翻版嗎?將1234567890這閉合的十個洞想象成 由這十個數字串一個接一個接起來的無限長的直線vari,j longint k array 0.9 of longint sum longint beg... 好啊,我是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...pascal程式設計 高精度求積
pascal程式設計
pascal 符串的處理,PASCAL 字串的處理