66 lines
2.4 KiB
Text
66 lines
2.4 KiB
Text
begin
|
|
% calculate the Multiplicative Digital Root (mdr) and Multiplicative Persistence (mp) of n %
|
|
procedure getMDR ( integer value n
|
|
; integer result mdr, mp
|
|
) ;
|
|
begin
|
|
mp := 0;
|
|
mdr := abs n;
|
|
while mdr > 9 do begin
|
|
integer v;
|
|
v := mdr;
|
|
mdr := 1;
|
|
while begin
|
|
mdr := mdr * ( v rem 10 );
|
|
v := v div 10;
|
|
v > 0
|
|
end do begin end;
|
|
mp := mp + 1;
|
|
end while_mdr_gt_9 ;
|
|
end getMDR ;
|
|
|
|
% task test cases %
|
|
write( " N MDR MP" );
|
|
for n := 123321, 7739, 893, 899998 do begin
|
|
integer mdr, mp;
|
|
getMDR( n, mdr, mp );
|
|
write( s_w := 1, i_w := 8, n, i_w := 3, mdr, i_w := 2, mp )
|
|
end for_n ;
|
|
|
|
begin % find the first 5 numbers with each possible MDR %
|
|
integer requiredMdrs;
|
|
requiredMdrs := 5;
|
|
begin
|
|
integer array firstFew ( 0 :: 9, 1 :: requiredMdrs );
|
|
integer array mdrFOund ( 0 :: 9 );
|
|
integer totalFound, requiredTotal, n;
|
|
for i := 0 until 9 do mdrFound( i ) := 0;
|
|
totalFound := 0;
|
|
requiredTotal := 10 * requiredMdrs;
|
|
n := -1;
|
|
while totalFound < requiredTotal do begin
|
|
integer mdr, mp;
|
|
n := n + 1;
|
|
getMDR( n, mdr, mp );
|
|
if mdrFound( mdr ) < requiredMdrs then begin
|
|
% found another number with this MDR and haven't found enough yet %
|
|
totalFound := totalFound + 1;
|
|
mdrFound( mdr ) := mdrFound( mdr ) + 1;
|
|
firstFew( mdr, mdrFound( mdr ) ) := n
|
|
end if_found_another_MDR
|
|
end while_totalFound_lt_requiredTotal ;
|
|
% print the table of MDRs andnumbers %
|
|
write( "MDR: [n0..n4]" );
|
|
write( "=== ========" );
|
|
for v := 0 until 9 do begin
|
|
write( i_w := 3, s_w := 0, v, ": [" );
|
|
for foundPos := 1 until requiredMdrs do begin
|
|
if foundPos > 1 then writeon( s_w := 0, ", " );
|
|
writeon( i_w := 1, s_w := 0, firstFew( v, foundPos ) )
|
|
end for_foundPos ;
|
|
writeon( s_w := 0, "]" )
|
|
end for_v
|
|
end
|
|
end
|
|
|
|
end.
|