Ulam numbers: Difference between revisions

Added Algol 68
m (syntax highlighting fixup automation)
(Added Algol 68)
Line 90:
<pre>
1 2 3 4 6 8 11 13 16 18 26 28 36 38 47 48 53 57 62 69 72 77 82 87 97 99 102 106 114 126 131 138 145 148 155 175 ...
</pre>
 
=={{header|ALGOL 68}}==
Same algotithm as XPL0.
<syntaxhighlight lang="algol68">
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 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;
print( ( " 1 2" ) );
INT u count := 2; # numer of ulam numbers found #
INT power of ten := 100; # next "power of ten" ulam number to show #
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 count +:= 1 ) < 20 THEN
print( ( " ", whole( i, 0 ) ) )
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 i - 1 DO
IF ulam[ p ] = one THEN
INT pi = p + i;
IF pi > UPB ulam THEN
# need a bigger ulam buffer #
[ 1 : UPB ulam + ulam size ]CHAR new ulam;
new ulam[ 1 : UPB ulam ] := ulam;
FOR u FROM UPB ulam + 1 TO UPB new ulam DO new ulam[ u ] := unused OD;
ulam := new ulam
FI;
CHAR u = ulam[ pi ];
IF u = unused
THEN ulam[ pi ] := one # p + i is unique so far #
ELIF u = one
THEN ulam[ pi ] := multiple # p + i isn't unique #
FI
FI
OD
FI
OD
END
</syntaxhighlight>
{{out}}
<pre>
1 2 3 4 6 8 11 13 16 18 26 28 36 38 47 48 53 57 62
The 100th Ulam number is: 690
The 1000th Ulam number is: 12294
The 10000th Ulam number is: 132788
</pre>
 
3,044

edits