2007-08-22
优化高精度减法 - [Algorithms]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://conoon.blogbus.com/logs/7858254.html
{说明:用字符串来存放减数和被减数,最大限制255位减255位}
{优化在于用一个数组元素存放4位数,节省存储空间}
program jjzx; {本程序没有考虑两负数相间减}
var s,s1,s2:string;
a,b,c:array[1..260] of integer;
i,l,m,k1,k2:integer;
d:char; {D用来表示正负号}
begin
writeln('input s1:');readln(s1);
writeln('input s2:');readln(s2);
l:=length(s1);
m:=length(s2);
if l begin
s:=s1;s1:=s2;s2:=s;d:='-'
end;
if l=m then {如果长度一样则直接比较,S1小就要与S2调换}
if s1 begin
s:=s1;s1:=s2;s2:=s;d:='-'
end;
l:=length(s1); m:=length(s2);
k1:=261;
repeat {转换S1,一个数组元素用来存放4位数字}
k1:=k1-1;
s:=copy(s1,l-3,4);
val(s,a[k1],i);
s1:=copy(s1,1,l-4);
l:=l-4
until l<=0;
k2:=261; {转换S2}
repeat
k2:=k2-1;
s:=copy(s2,m-3,4);
val(s,b[k2],i);
s2:=copy(s2,1,m-4);
m:=m-4
until m<=0;
for i:=260 downto k1 do
if a[i] begin
c[i]:=a[i]+10000-b[i]; {注意是加上10000}
a[i-1]:=a[i-1]-1;
end
else
c[i]:=a[i]-b[i];
writeln('jie guo shi :');
write(d:2); {首先输出符号位}
write(c[k1]); {在输出最高位,因为最高位不用补0}
for i:=k1+1 to 260 do {注意补0的方法}
begin
if c[i]<1000 then write('0');
if c[i]<100 then write('0');
if c[i]<10 then write('0');
write(c[i]);
end;
writeln
end.
收藏到:Del.icio.us





