(* Compute the harmonic function H(n) = 1 + 1/2 + 1/3 + ... + 1/n with m digits accuracy. *) MODULE harmonic; FROM InOut IMPORT WriteString, WriteLn, WriteCard, ReadCard, Write; CONST lim = 100; VAR i,k,m,n,c,r,q,sum: CARDINAL; d,s: ARRAY [0..lim] OF CARDINAL; BEGIN WriteString('Digits of Accuracy> '); ReadCard(m); WriteLn; WriteString('n> '); ReadCard(n); IF (m > 0) AND (m < lim) THEN d[0] := 0; s[0] := 1; FOR i := 1 TO m DO s[i] := 0 END; FOR k := 2 TO n DO (* compute 1/k *) r := 1; FOR i := 1 TO m DO r := 10*r; q := r DIV k; r := r - q*k; d[i] := q; END; IF (10*r DIV k) >= 5 THEN d[m] := d[m]+1 END; (* round *) WriteString(' 0.'); (* intermediate output *) FOR i := 1 TO m DO WriteCard(d[i],1) END; WriteLn; (* compute s := s + 1/k *) c := 0; FOR i := m TO 0 BY -1 DO sum := s[i]+d[i]+c; IF sum >= 10 THEN sum := sum-10; c := 1 ELSE c := 0; s[i] := sum END END END; Write(' '); WriteCard(s[0],1); Write(' '); FOR i := 1 TO m DO WriteCard(s[i],1) END; WriteLn; END END harmonic.