Ulam numbers: Difference between revisions

→‎{{header|ALGOL 68}}: Improve the algorithm to be more like the XPL0 sample
(Added Algol 68)
(→‎{{header|ALGOL 68}}: Improve the algorithm to be more like the XPL0 sample)
Line 97:
BEGIN # find some Ulam numbers, U(n) = the smallest number > U(n-1) that is #
# the uniue sum of U(i) and U(j), i, j < n, i =/= j, U(1)=1, U(2) = 2 #
INT max ulam = 10 000; # maximum ulam number to find #
[ 1 : max ulam ]INT u; # ulam numbers found #
FOR i FROMTO 3UPB WHILEu DO u[ counti <] 10:= 0000 DOOD;
INT ulam size = 20 000; # initial size of the ulam number buffer #
CHAR unused = "0", one = "1", multiple = "2"; # states of ulam numbers #
FLEX[ 1 : ulam size ]CHAR ulam;FOR i TO UPB ulam DO ulam[ i ] := unused OD;
ulam[ 3 ] := ulam[ 2 ] := ulam[ 1 ] := one; u[ 1 ] := 1; u[ 2 ] := 2;
print( ( " 1 2" ) );
INT u count := 2; 2; # numer of ulam numbers found #
INT power of ten := 100; 100; # next "power of ten" ulam number to show #
FOR i FROM 3 WHILE u count < max ulam DO
INT max ulam = 10 000; # maximum ulam number to find #
FOR i FROM 3 WHILE u count < 10 000 DO
IF ulam[ i ] = one THEN
# can use this number #
IF (u[ u count +:= 1 )] < 20:= THENi;
IF u count < print(21 ( " ", whole( i, 0 ) ) )THEN
print( ( " ", FIwhole( i, 0 ) ) );
IF u count = 20 THEN print( ( "..." ) ) FI
ELIF u count = power of ten THEN
print( ( newline, "The ", whole( power of ten, -6 ), "th Ulam number is: ", whole( i, 0 ) ) );
power of ten *:= 10
FI;
FOR p TO iu count - 1 DO
IFINT ulam pi = u[ p ] = one+ THENi;
INT IF pi => pUPB +ulam i;THEN
IF# pineed >a UPBbigger ulam THENbuffer #
[ 1 : UPB #ulam need a bigger+ ulam buffersize ]CHAR new # ulam;
new ulam[ 1 : UPB ulam + ulam size ]CHAR new:= ulam;
FOR u FROM newUPB ulam[ + 1 :TO UPB new ulam DO new ulam[ u ] := ulamunused OD;
FOR u FROM UPB ulam + 1 TO UPB:= new ulam DO new ulam[ u ] := unused OD;
ulam := new ulamFI;
CHAR upi = FIulam[ pi ];
IF CHAR u upi = ulam[ pi ];unused
THEN ulam[ pi ] IF:= one u = unused # p + i is unique so far #
ELIF upi THEN ulam[ pi ] := one # p + i is unique so far #
THEN ulam[ pi ] := multiple # p + i isn't unique ELIF u = one#
THEN ulam[ pi ] := multiple # p + i isn't unique #
FI
FI
OD
Line 138 ⟶ 140:
{{out}}
<pre>
1 2 3 4 6 8 11 13 16 18 26 28 36 38 47 48 53 57 62 69...
The 100th Ulam number is: 690
The 1000th Ulam number is: 12294
3,044

edits