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.