Pascal 高精度加法
发布网友
发布时间:2022-05-15 19:13
我来回答
共2个回答
热心网友
时间:2024-02-27 06:34
if c[i-1]<>-1 then write(a[i]);
低级错误啊
不过更正过来程序好像还有问题
下面是我对此程序更正后的结果:
Program gaojing;
Uses
crt;
Type
longlong=array[-100..101] of shortint;{如果要后退100位,则必然会读取到a[-x],造成错误}
Var
a,b,c:longlong;
m,n:integer;
Procere init(var a,b:longlong;var m,n:integer);
Var
i,j:integer;
s:char;
Begin
for i:=1 to 2 do
begin
j:=0;
writeln('Input ',chr(i+96));
repeat
j:=j+1;
s:=readkey;
if s in ['0'..'9'] then
begin
write(s);
if i=1 then
a[j]:=ord(s)-48 else
b[j]:=ord(s)-48;
end;
until (s=#13)or(not(s in ['0'..'9']));
writeln;
if i=1 then m:=j else n:=j;
end;
End;
Procere machine(var c:longlong; a,b:longlong; m,n:integer);
Var
i,l:integer;
Begin
if m>n then l:=m else l:=n;
for i:=l downto 1 do
begin
a[i]:=a[m-l+i]; {移动的算式错误}
b[i]:=b[n-l+i]; {移动的算式错误}
end;
for i:=l downto 1 do
begin
c[i]:=a[i]+b[i]+c[i];
if c[i]>=10 then{满十进位,不是超十进位}
begin
c[i-1]:=1;
c[i]:=c[i]-10;
end;
end;
for i:=l+1 to 100 do c[i]:=-1;
End;
Procere shuchu(c:longlong);
Var
i:integer;
Begin
if c[0]<>0 then write(c[0]); {首位可能为0,要单独考虑是否输出}
for i:=1 to 100 do {从c[1]开始输出}
if c[i]<>-1 then write(c[i]);{更正输出a[i]的低级错误}
End;
Begin
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
init(a,b,m,n);
m:=m-1;n:=n-1; {m,n在读入数据时多出一位,在这里修正}
machine(c,a,b,m,n);
shuchu(c);
End.
热心网友
时间:2024-02-27 06:34
高精度运算
在实际中,我们常常需要进行一些很大的数的运算。但是我们知道,计算机中整数的范围是有限的,这时候,我们就需要用到所谓的高精度运算。
通俗地讲,高精度运算就是用一个数组来表示整数,用模拟人解竖式的方法进行计算。
用一个整型数组表示一个数,其中数组的每一个元素表示数的一位。第一个元素表示个位,第二个元素表示十位,以此类推。另外还需要一个变量来存放这个数的长度,通常把这个长度存放在数组下标为0的元素中。
多余的元素要设成0。
高精度加法
从个位开始,依次相加。注意进位。
两个数相加,和的长度有可能大于其中任何一个数,因此要注意最后正确设置和的长度。
A[i]=a[i]+b[i],若a[i]>9
则
dec(a[i],10),
inc(a[I+1]);
17532+2349=19881
17532
+
2349
--------------
19881
program
gjdplus(input,output);
var
st:string;
x,y:array[0..101]of
integer;
i,j,l1,l2:integer;
begin
assign(input,'gjdplus.in');
reset(input);
readln(st);
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0);
l1:=length(st);
for
i:=l1
downto
1
do
x[l1-i]:=ord(st[i])-ord('0');
readln(st);
l2:=length(st);
for
j:=l2
downto
1
do
y[l2-j]:=ord(st[j])-ord('0');
close(input);
if
l1<l2
then
l1:=l2;
for
i:=0
to
l1
do
begin
x[i]:=x[i]+y[i];
if
x[i]>=10
then
begin
inc(x[i+1]);
dec(x[i],10);
end;
end;
while
x[l1]<>0
do
inc(l1);
assign(output,'gjdplus.out');
rewrite(output);
for
i:=l1-1
downto
0
do
write(x[i]);
close(output);
end.
高精度减法
从个位开始,依次相减。有借位时向上一位借位。
两个数相减,差的长度有可能小于其中任何一个数,因此要注意最后正确设置差的长度。
这里不考虑出现小数减大数的情况。
A[i]<b[i]
则
dec(a[I+1]),inc(a[i],10),a[i]:=a[i]-b[i]
program
gjdj(input,output);
var
st:string;
x,y:array[0..101]of
integer;
i,j,l1,l2:integer;
begin
assign(input,'gjdplus.in');
reset(input);
readln(st);
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0);
l1:=length(st);
for
i:=l1
downto
1
do
x[l1-i]:=ord(st[i])-ord('0');
readln(st);
l2:=length(st);
for
j:=l2
downto
1
do
y[l2-j]:=ord(st[j])-ord('0');
close(input);
for
i:=0
to
l1
do
begin
if
x[i]<y[i]
then
begin
dec(x[i+1]);
inc(x[i],10);
end;
x[i]:=x[i]-y[i];
end;
while
(x[l1]=0)and(l1>0)
do
dec(l1);
assign(output,'gjdplus.out');
rewrite(output);
for
i:=l1
downto
0
do
write(x[i]);
close(output);
end.
第29课
高精度乘法
乘法相对来说要麻烦一些,但其本质思想仍然是一样的。
注意:乘法在累加的时候,进位可能大于1。因此要采用不同的进位方法。
532*349=185668
532
*
349
--------------
4788
2128
1596
--------------
185668
program
gjdj(input,output);
var
st:string;
x,y,c:array[0..101]of
integer;
i,j,temp,l1,l2,l3,k:integer;
begin
assign(input,'gjdplus.in');
reset(input);
readln(st);
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0);
fillchar(c,sizeof(c),0);
l1:=length(st);
for
i:=l1
downto
1
do
x[l1-i+1]:=ord(st[i])-ord('0');
readln(st);
l2:=length(st);
for
j:=l2
downto
1
do
y[l2-j+1]:=ord(st[j])-ord('0');
close(input);
for
j:=1
to
l2
do
for
i:=1
to
l1
do
begin
inc(c[i+j-1],x[i]*y[j]);
inc(c[i+j],c[i+j-1]div
10);
c[i+j-1]:=c[i+j-1]
mod
10;
end;
k:=l1+l2+1;
while
(k>1)
and
(c[k]=0)do
dec(k);
assign(output,'gjdplus.out');
rewrite(output);
for
i:=k
downto
1
do
write(c[i]);
close(output);
end.