Digital root/Multiplicative digital root: Difference between revisions
Content added Content deleted
m (add RPL) |
(Added XPL0 example.) |
||
Line 3,683: | Line 3,683: | ||
8: [8, 18, 24, 29, 36] |
8: [8, 18, 24, 29, 36] |
||
9: [9, 19, 33, 91, 119] |
9: [9, 19, 33, 91, 119] |
||
</pre> |
|||
=={{header|XPL0}}== |
|||
{{trans|ALGOL W}} |
|||
<syntaxhighlight lang "XPL0"> \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</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
N MDR MP |
|||
123321 8 3 |
|||
7739 8 3 |
|||
893 2 3 |
|||
899998 0 2 |
|||
MDR: [N0..N4] |
|||
=== ======== |
|||
0: [0, 10, 20, 25, 30] |
|||
1: [1, 11, 111, 1111, 11111] |
|||
2: [2, 12, 21, 26, 34] |
|||
3: [3, 13, 31, 113, 131] |
|||
4: [4, 14, 22, 27, 39] |
|||
5: [5, 15, 35, 51, 53] |
|||
6: [6, 16, 23, 28, 32] |
|||
7: [7, 17, 71, 117, 171] |
|||
8: [8, 18, 24, 29, 36] |
|||
9: [9, 19, 33, 91, 119] |
|||
</pre> |
</pre> |
||