INCLUDE "D2:PRINTF.ACT" ;from the Action! Tool Kit PROC MertensNumbers(INT ARRAY m INT count) INT n,k m(1)=1 FOR n=2 TO count DO m(n)=1 FOR k=2 TO n DO m(n)==-m(n/k) OD OD RETURN PROC PrintMertens(INT ARRAY m INT count) CHAR ARRAY s(6) INT i,col PrintF("First %I Mertens numbers:%E ",count) col=1 FOR i=1 TO count DO StrI(m(i),s) PrintF("%3S",s) col==+1 IF col=10 THEN col=0 PutE() FI OD RETURN PROC Main() DEFINE MAX="1001" INT ARRAY m(MAX) INT i,zeroCnt=[0],crossCnt=[0],prev=[0] Put(125) PutE() ;clear the screen PrintF("Calculation of Mertens numbers,%E please wait...") MertensNumbers(m,MAX) Put(125) PutE() ;clear the screen PrintMertens(m,99) FOR i=1 TO MAX DO IF m(i)=0 THEN zeroCnt==+1 IF prev THEN crossCnt==+1 FI FI prev=m(i) OD PrintF("%EM(n) is zero %I times for 1<=n<=%I.%E",zeroCnt,MAX-1) PrintF("%EM(n) crosses zero %I times for 1<=n<=%I.%E",crossCnt,MAX-1) RETURN