63 lines
2.3 KiB
Text
63 lines
2.3 KiB
Text
\Calculate the Multiplicative Digital Root (MDR) and
|
|
\ Multiplicative Persistence (MP) of N
|
|
procedure GetMDR ( N, MDR, MP );
|
|
integer N, MDR, MP, V;
|
|
begin
|
|
MP(0) := 0;
|
|
MDR(0) := abs( N );
|
|
while MDR(0) > 9 do begin
|
|
V := MDR(0);
|
|
MDR(0) := 1;
|
|
repeat
|
|
MDR(0) := MDR(0) * rem( V / 10 );
|
|
V := V / 10;
|
|
until V = 0;
|
|
MP(0) := MP(0) + 1;
|
|
end; \while_mdr_gt_9
|
|
end; \GetMDR
|
|
|
|
define RequiredMDRs = 5;
|
|
integer FirstFew ( 9+1, 1+RequiredMDRs );
|
|
integer MDRFound ( 9+1 );
|
|
integer TotalFound, FoundPos, RequiredTotal, N, I, V, L;
|
|
integer MDR, MP;
|
|
begin
|
|
\task test cases
|
|
Text(0, " N MDR MP^m^j" );
|
|
L := [ 123321, 7739, 893, 899998 ];
|
|
for N := 0 to 3 do begin
|
|
GetMDR( L(N), @MDR, @MP );
|
|
Format(8, 0); RlOut(0, float(L(N)));
|
|
Format(4, 0); RlOut(0, float(MDR));
|
|
Format(3, 0); RlOut(0, float(MP));
|
|
CrLf(0)
|
|
end; \for_N
|
|
\find the first 5 numbers with each possible MDR
|
|
begin
|
|
for I := 0 to 9 do MDRFound( I ) := 0;
|
|
TotalFound := 0;
|
|
RequiredTotal := 10 * RequiredMDRs;
|
|
N := -1;
|
|
while TotalFound < RequiredTotal do begin
|
|
N := N + 1;
|
|
GetMDR( N, @MDR, @MP );
|
|
if MDRFound( MDR ) < RequiredMDRs then begin
|
|
\Found another number with this MDR and haven't found enough
|
|
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 and numbers
|
|
Text(0, "MDR: [N0..N4]^m^j" );
|
|
Text(0, "=== ========^m^j" );
|
|
for V := 0 to 9 do begin
|
|
ChOut(0, ^ ); IntOut(0, V); Text(0, ": [");
|
|
for FoundPos := 1 to RequiredMDRs do begin
|
|
if FoundPos > 1 then Text( 0, ", " );
|
|
IntOut( 0, FirstFew( V, FoundPos ) )
|
|
end; \for_FoundPos
|
|
Text(0, "]^m^j")
|
|
end \for_v
|
|
end
|
|
end
|