61 lines
1.3 KiB
Plaintext
61 lines
1.3 KiB
Plaintext
BEGIN
|
|
|
|
INTEGER N, LEN, YES, NO, LIMIT, LONGEST, NLONG;
|
|
|
|
% RETURN P MOD Q %
|
|
INTEGER FUNCTION MOD(P, Q);
|
|
INTEGER P, Q;
|
|
BEGIN
|
|
MOD := P - Q * (P / Q);
|
|
END;
|
|
|
|
% COMPUTE AND OPTIONALLY DISPLAY HAILSTONE SEQUENCE FOR N. %
|
|
% RETURN LENGTH OF SEQUENCE OR ZERO ON OVERFLOW. %
|
|
INTEGER FUNCTION HAILSTONE(N, DISPLAY);
|
|
INTEGER N, DISPLAY;
|
|
BEGIN
|
|
INTEGER LEN;
|
|
LEN := 1;
|
|
IF DISPLAY = 1 THEN WRITE("");
|
|
WHILE (N <> 1) AND (N > 0) DO
|
|
BEGIN
|
|
IF DISPLAY = 1 THEN WRITEON(N," ");
|
|
IF MOD(N,2) = 0 THEN
|
|
N := N / 2
|
|
ELSE
|
|
N := (N * 3) + 1;
|
|
LEN := LEN + 1;
|
|
END;
|
|
IF DISPLAY = 1 THEN WRITEON(N);
|
|
HAILSTONE := (IF N < 0 THEN 0 ELSE LEN);
|
|
END;
|
|
|
|
% EXERCISE THE FUNCTION %
|
|
YES := 1; NO := 0;
|
|
WRITE("DISPLAY HAILSTONE SEQUENCE FOR WHAT NUMBER?");
|
|
READ(N);
|
|
LEN := HAILSTONE(N, YES);
|
|
WRITE("SEQUENCE LENGTH =", LEN);
|
|
|
|
% FIND LONGEST SEQUENCE BEFORE OVERFLOW %
|
|
N := 2;
|
|
LONGEST := 1;
|
|
LEN := 2;
|
|
NLONG := 2;
|
|
LIMIT := 1000;
|
|
WRITE("SEARCHING FOR LONGEST SEQUENCE UP TO N =",LIMIT," ...");
|
|
WHILE (N < LIMIT) AND (LEN <> 0) DO
|
|
BEGIN
|
|
LEN := HAILSTONE(N, NO);
|
|
IF LEN > LONGEST THEN
|
|
BEGIN
|
|
LONGEST := LEN;
|
|
NLONG := N;
|
|
END;
|
|
N := N + 1;
|
|
END;
|
|
IF LEN = 0 THEN WRITE("SEARCH TERMINATED WITH OVERFLOW AT N =",N-1);
|
|
WRITE("MAXIMUM SEQUENCE LENGTH =", LONGEST, " FOR N =", NLONG);
|
|
|
|
END
|