高精度加法

1.从键盘读入两个正整数,求它们的和。
分析:从键盘读入两个数到两个变量中,然后用赋值语句求它们的和,输出。但是,我们知道,在pascal 语言中任何数据类型都有一定的表示范围。而当两个被加数据大时,上述算法显然不能求出精确解,因此我们需要寻求另外一种方法。在读小学时,我们做加法都采用竖式方法。 这样,我们方便写出两个整数相加的算法。
      A3 A2 A1
  +   B3 B2 B1
-----------------
   C4 C3 C2 C1
我们用数组A、B分别存储加数和被加数,用数组C 存储结果。
因此,算法描述如下:
procedure add(a,b;var c);
{ a,b,c 都为数组,a存储被加数,b 存储加数,c 存储结果 }
var i,x:integer;
begin
  i:=1;
  x:=0;
 while (i<=a 数组长度) or(i<=b 数组的长度) do 
begin x := a[i] + b[i] + x div 10; {第i位相加并加上次的进位} c[i] := x mod 10; {存储第i 位的值} i := i + 1 {位置指针变量} end end; 通常,读入的两个整数用可用字符串来存储

 

 1 program exam1;
 2 const max=200;
 3 var a,b,c:array[1..max] of 0..9;
 4          n:string;
 5          lena,lenb,lenc,i,x:integer;
 6 begin
 7   readln(n);
 8   lena:=length(n); {加数放入a 数组}
 9    for i:=1 to lena do a[lena-i+1]:=ord(n[i])-ord(’0’);
10   readln(n);
11   lenb:=length(n); {被加数放入b数组}
12    for i:=1 to lenb do b[lenb-i+1]:=ord(n[i])-ord(’0’);
13   i:=1;
14   x:=0;
15   while (i<=lena) or(i<=lenb) do
16   begin
17     x := a[i] + b[i] + x div 10; {两数相加,然后加前次进位}
18     c[i] := x mod 10; {保存第i 位的值}
19     i := i + 1
20   end;
21  if x>=10 then {处理最高进位}
22  begin lenc:=i;c[i]:=1; end
23   else lenc:=i-1;
24  for i:=lenc downto 1 do write(c[i]); {输出结果}
25  writeln
26 end.

 

posted @ 2015-12-05 19:54  ZJQCation  阅读(271)  评论(0编辑  收藏  举报