45 lines
1.1 KiB
Plaintext
45 lines
1.1 KiB
Plaintext
|
|
**FREE
|
||
|
|
Ctl-Opt Main(ThreeNPlusOne);
|
||
|
|
|
||
|
|
Dcl-Proc ThreeNPlusOne;
|
||
|
|
Dcl-S n Packed(10);
|
||
|
|
Dcl-S counter Int(10) Inz(0);
|
||
|
|
Dcl-S input_prompt VarChar(50) Inz('Enter a positive integer (or 0 to exit):');
|
||
|
|
|
||
|
|
// Use an infinite loop, exit when user enters 0
|
||
|
|
Dow (1 = 1);
|
||
|
|
Dsply input_prompt ' ' n;
|
||
|
|
|
||
|
|
If n = 0;
|
||
|
|
Leave;
|
||
|
|
EndIf;
|
||
|
|
|
||
|
|
If n < 0;
|
||
|
|
input_prompt = 'Positive integers only. Enter a number:';
|
||
|
|
Iter;
|
||
|
|
EndIf;
|
||
|
|
|
||
|
|
// Start sequence calculation
|
||
|
|
input_prompt = 'Enter a positive integer (or 0 to exit):'; // Reset prompt
|
||
|
|
counter = 0;
|
||
|
|
Dsply ('Sequence for ' + %Char(n) + ':');
|
||
|
|
|
||
|
|
Dow n > 1;
|
||
|
|
If %Rem(n:2) = 0;
|
||
|
|
// n is even, divide by 2
|
||
|
|
n = n / 2;
|
||
|
|
Else;
|
||
|
|
// n is odd, multiply by 3 and add 1
|
||
|
|
n = (n * 3) + 1;
|
||
|
|
EndIf;
|
||
|
|
|
||
|
|
counter = counter + 1;
|
||
|
|
Dsply %Char(n);
|
||
|
|
EndDo;
|
||
|
|
|
||
|
|
Dsply ('Reached 1 in ' + %Char(counter) + ' iterations.');
|
||
|
|
Dsply ' '; // Add a blank line for readability
|
||
|
|
EndDo;
|
||
|
|
|
||
|
|
End-Proc ThreeNPlusOne;
|