|| 返回 || 本站首页 ||奥赛信息||计算机基础||pascal基础||数据结构||经典算法||试题汇编||校本教程||自主练习||

|| 经典算法 >> 优化高精度减法

双击自动滚屏 

   

优化高精度减法

阳明

 

{说明:用字符串来存放减数和被减数,最大限制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.


 
 

 

 
 
 

制作与维护:重庆市忠县中学 谭海