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




    Tag:
    引用地址:

发表评论

您将收到博主的回复邮件
记住我