PROGRAM PowerFinder; {Declarations module} CONST Terminal = 11; {max. number of terminal digits} TYPE Number = ARRAY[1..Terminal] OF INTEGER; VAR Rot, Digits, RightDigits, DigitsLeft : INTEGER; Power : LONGINT; LastDigits : Number; {array to hold the 'terminal' digits} Fits : BOOLEAN; {test variable to ensure terminal digits fit the pattern} BEGIN {program} {Initialization module - includes display of column headings} WRITELN('Significant Digits Power Terminal Digits'); WRITELN; Power := 0; RightDigits := 1; DigitsLeft := RightDigits; FOR Rot := 1 TO Terminal DO {initialize array to all 0's} LastDigits[Rot] := 0; LastDigits[1] := 1; {put first value in array} REPEAT FOR Digits := DigitsLeft TO Terminal DO BEGIN {loop} Rot := 1; Fits := FALSE; {re-initialize variables for each loop iteration} {Array test module} REPEAT Fits := ((LastDigits[Rot] = 1) OR (LastDigits[Rot] = 2)); Rot := Rot + 1; UNTIL ((NOT (Fits)) OR (Rot > Digits)); {Display module} IF (Fits) THEN BEGIN WRITE(' ', RightDigits:2, ' '); WRITE(Power:10, ' '); {Display array in correct order} FOR Rot := RightDigits DOWNTO 1 DO WRITE(LastDigits[Rot]:1); WRITELN; {advance to next line to prepare for next answer} {increment value of RDigits every time an answer is found/displayed} RightDigits := RightDigits + 1; END; {} END; {loop} {Array Doubling/Carrying module} FOR Rot := 1 TO Terminal DO LastDigits[Rot] := LastDigits[Rot] + LastDigits[Rot]; FOR Rot := 1 TO Terminal DO IF (LastDigits[Rot] > 9) THEN BEGIN { } LastDigits[Rot] := LastDigits[Rot] - 10; {subtract excess to carry} IF (Rot < Terminal) THEN {if not on last digit then carry over 1} LastDigits[Rot + 1] := LastDigits[Rot + 1] + 1; END; {Calculate new 'Power' of 2 being tested} Power := Power + 1; {Decrement amount of checking to be done when an answer has been found} DigitsLeft := RightDigits; UNTIL (RightDigits > Terminal); {loop until all 'terminal' digits have been found} END. {program}