您现在的位置:小学生自学网>> 信息>> pascal语言>> 基础教程

加法神童——高精度加法

作者: 来源: 发布时间:2009年05月12日 点击数:
 

科学城里住着一位加法神童,他可以在一秒钟内算出两个大数相加的结果,这两个数可不是普通的数字,
它们是 11 位以上的“庞然大物”,为了证明自己神奇的计算能力,加法神童请全城的人民都来出题目来考自
己,只要答错一题他就自愿放弃“加法神童”的称号。
你是否也想考考加法神童呢?还是先编写一个程序帮我们算出任意两个 11 位以上的数相加的精确结果吧。
输入格式(add.in):文件有两行分别是两个需要相加的数,这两个数在                    11 ~   100 之间。
                                                                                 10     10

输出格式(add.out):输出两个大数,相加的精确结果。
输入输出样例:
     输入:8569742356145896

             215783669444444427

     输出:224353411800590323
      【分析】
            (1)      由于两个加数都很大,已经超出一般的数值型数据类型的表示范围,因此需要用字符串
                      来接收两个数,再用字符串截取的方法取出每一位并转换成数字存放到数值型数组中。
                      用a 数组存放第一个数,用b 数组存放第二个数。
            (2 )     用 c  数组存放计算机结果。从低位到高位依次将各个位数相加,即 a[i]+b[i]。对需要进
                      位的采用进位处理方法,即如果 c[i]>=10           则  c[i]:=c[i]-10;c[i+1]:=c[i+1]+1 。因为c[i]还存
                      放着前一位计算结果的进位,因此实际上应该是c[i]:=a[i]+b[i]+c[i].
            (3)      从高位到低位输出。如果最后一位数字相加后产生进位,则最高位j 应加 1,即从j+1 位
                      开始输出结果。

        【参考程序】
       Program P12_1;
            Var s1,s2:string;
                A,b,c:array[1..101] of integer;
                Cd1,cd2,I,j:integer;
                    Begin
                      Assign(input,'add.in');reset(input);
                      Assign(output,'add.out');rewrite(output);
                      Readln(s1);     readln(s2);
                      Cd1:=length(s1); cd2:=length(s2);
                      If cd1>cd2 then j:=cd1 else j:=cd2;       {找出最高位}
                         For i:=1 to cd1 do
                             a[cd1-i+1]:=ord(s1[i])-ord('0');       {s1[1]~s1[cd1]转换到a[cd1]~a[1]中}
                         For i:=1 to cd2 do
                             b[cd2-i+1]:=ord(s2[i])-ord('0');       //用  downto 语句代替可以吗?  NO
                        For i:=1 to j do
                             Begin
                                 C[i]:=a[i]+b[i]+c[i];
                                  If c[i]>=10 then
                                      Begin
                                          C[i]:=c[i]-10 ;      {进位处理}
                                          C[i+1]:=c[i+1]+1;
    End;
                     If c[j+1]<>0 then j:=j+1;            {如果最后一位数字相加后产生进位则从j+1 位输出}
                     For i:=j downto 1 do write(c[i]);        {输出相加的和}
                     Writeln;
                     Close(input);close(output);
                  End.

 Add.in   Add.out   P12-1.pas

                注:参考上面的程序,编写任意两位 n 进制数的高精度加法程序。  P12-1-1.pas                                     End;