Munchausen numbers: Difference between revisions

Content added Content deleted
m (→‎{{header|Pascal}}: failure found wrong numbers in const DgtPotDgt, now calculating even 438579088 in an blink of an eye---)
(→‎{{header|ALGOL 68}}: Revised algorithm)
Line 12: Line 12:
<lang algol68># Find Munchausen Numbers between 1 and 5000 #
<lang algol68># Find Munchausen Numbers between 1 and 5000 #
# note that 6^6 is 46 656 so we only need to cosider numbers consisting of 0 to 5 #
# note that 6^6 is 46 656 so we only need to cosider numbers consisting of 0 to 5 #

# table of Nth powers - note 0^0 is 0 for Munchausen numbers, not 1 #
# table of Nth powers - note 0^0 is 0 for Munchausen numbers, not 1 #
[]INT nth power = ([]INT( 0, 1, 2 * 2, 3 * 3 * 3, 4 * 4 * 4 * 4, 5 * 5 * 5 * 5 * 5 ))[ AT 0 ];
[]INT nth power = ([]INT( 0, 1, 2 * 2, 3 * 3 * 3, 4 * 4 * 4 * 4, 5 * 5 * 5 * 5 * 5 ))[ AT 0 ];

INT number := 0;
INT d1 := 0; INT d1 part := 0;
FOR d1 FROM 0 TO 5 WHILE number < 5001 DO
INT d2 := 0; INT d2 part := 0;
INT d1 part = d1 * 1000;
INT d3 := 0; INT d3 part := 0;
INT d4 := 1;
FOR d2 FROM 0 TO 5 DO
WHILE d1 < 6 DO
INT d2 part = d2 * 100;
INT number = d1 part + d2 part + d3 part + d4;
FOR d3 FROM 0 TO 5 DO
INT digit power sum := nth power[ d1 ]
INT d3 part = d3 * 10;
FOR d4 FROM 0 TO 5 DO
+ nth power[ d2 ]
INT digit power sum := nth power[ d1 ]
+ nth power[ d3 ]
+ nth power[ d2 ]
+ nth power[ d4 ];
IF digit power sum = number THEN
+ nth power[ d3 ]
IF number > 0 THEN
+ nth power[ d4 ];
number := d1 part + d2 part + d3 part + d4;
print( ( whole( number, 0 ), newline ) )
FI
IF digit power sum = number THEN
FI;
IF number > 0 THEN
d4 +:= 1;
print( ( whole( number, 0 ), newline ) )
FI
IF d4 > 5 THEN
FI
d4 := 0;
OD
d3 +:= 1;
OD
d3 part +:= 10;
IF d3 > 5 THEN
OD
d3 := 0;
OD</lang>
d3 part := 0;
d2 +:= 1;
d2 part +:= 100;
IF d2 > 5 THEN
d2 := 0;
d2 part := 0;
d1 +:= 1;
d1 part +:= 1000;
FI
FI
FI
OD
</lang>
{{out}}
{{out}}
<pre>
<pre>