63 lines
1.4 KiB
Plaintext
63 lines
1.4 KiB
Plaintext
comment
|
|
Compute and display "hailstone" (i.e., Collatz) sequence
|
|
for a given number and find the longest sequence in the
|
|
range permitted by S-BASIC's 16-bit integer data type.
|
|
end
|
|
|
|
$lines
|
|
|
|
$constant false = 0
|
|
$constant true = FFFFH
|
|
|
|
rem - compute p mod q
|
|
function mod(p, q = integer) = integer
|
|
end = p - q * (p/q)
|
|
|
|
comment
|
|
Compute, and optionally display, hailstone sequence for n.
|
|
Return length of sequence or zero on overflow
|
|
end
|
|
function hailstone(n, display = integer) = integer
|
|
var length = integer
|
|
length = 1
|
|
while (n <> 1) and (n > 0) do
|
|
begin
|
|
if display then print using "##### ", n;
|
|
if mod(n,2) = 0 then
|
|
n = n / 2
|
|
else
|
|
n = (n * 3) + 1
|
|
length = length + 1
|
|
end
|
|
if display then print using "##### ", n
|
|
rem - return 0 on overflow
|
|
if n < 0 then length = 0
|
|
end = length
|
|
|
|
var n, limit, slen, longest, n_longest = integer
|
|
|
|
input "Display hailstone sequence for what number"; n
|
|
slen = hailstone(n, true)
|
|
print "Sequence length = "; slen
|
|
|
|
rem - find longest sequence before overflow
|
|
n = 2
|
|
longest = 1
|
|
slen = 1
|
|
limit = 1000;
|
|
print "Searching for longest sequence up to N =", limit," ..."
|
|
while (n < limit) and (slen <> 0) do
|
|
begin
|
|
slen = hailstone(n, false)
|
|
if slen > longest then
|
|
begin
|
|
longest = slen
|
|
n_longest = n
|
|
end
|
|
n = n + 1
|
|
end
|
|
if slen = 0 then print "Search terminated with overflow at";n-1
|
|
print "Maximum sequence length =";longest;" for N =";n_longest
|
|
|
|
end
|