Re: RPN Programming exercise (HP-42S) - Printable Version +- HP Forums (https://archived.hpcalc.org/museumforum) +-- Forum: HP Museum Forums (https://archived.hpcalc.org/museumforum/forum-1.html) +--- Forum: Old HP Forum Archives (https://archived.hpcalc.org/museumforum/forum-2.html) +--- Thread: Re: RPN Programming exercise (HP-42S) (/thread-212752.html) Re: RPN Programming exercise (HP-42S) - Gerson W. Barbosa - 02-27-2012 Thanks all of you for your participation and interesting solutions. Most of them supersede mine, as they are shorter, faster and accept a wider range of operands, exactly what I expected them to be. Here are my solutions: ```00 { 77-Byte Prgm } 01>LBL "MLTA" 02 0 03 0.099 04 Rv 05>LBL 00 06 STO IND ST T 07 RCL+ ST Y 08 ISG ST T 09 GTO 00 10 RCL ST Z 11 CLA 12 AIP 13 XEQ 02 14 XEQ 02 15 RCL IND ST Y 16 RCL IND ST Y 17 1.1 18 Rv 19>LBL 01 20 RCL+ ST Y 21 ISG ST T 22 GTO 01 23 RTN 24>LBL 02 25 ATOX 26 RCL+ ST X 27 LASTX 28 -3 29 ROTXY 30 + 31 ATOX 32 + 33 528 34 - 35 END ``` This will accept two numbers in the range [1000..9999] and give their product. Examples: ```1234 ENTER 5678 XEQ MLTA --> 7,006,652 9999 ENTER XEQ MLTA --> 99,980,001 ``` Here is an equivalent QBASIC program: ``` CLS DEFINT A-D, I DEFDBL S DIM M(100) INPUT A, B C = VAL(MID\$(STR\$(B), 2, 2)): REM C = B \ 100 D = VAL(RIGHT\$(STR\$(B), 2)): REM D = B - 100 * C S = 0 FOR I = 0 TO 99 M(I) = S S = S + A NEXT I S = M(D) FOR I = 1 TO 100 S = S + M(C) NEXT I PRINT S END ? 1234,5678 7006652 ``` The next program is an implementation of the Russian Peasant Multiplication Method: ```00 { 52-Byte Prgm } 01>LBL "MLTB" 02 0 03 STO 00 04 Rv 05>LBL 00 06 0 07 BIT? 08 XEQ 01 09 BASE+ 10 X=0? 11 GTO 02 12 1 13 ROTXY 14 X<>Y 15 -1 16 ROTXY 17 X<>Y 18 GTO 00 19>LBL 01 20 NOT 21 BASE+ 22 X<>Y 23 STO+ 00 24 X<>Y 25 0 26 RTN 27>LBL 02 28 RCL 00 29 .END. ``` This will give the product of any two positive integer numbers, as long as the result doesn't exceed 236-1. Examples: ```12 ENTER 3456789 XEQ MLTB --> 41,481,468 1234 ENTER 5678 XEQ MLTB --> 7,006,652 262143 ENTER XEQ MLTB --> 68,718,952,449 ``` Here is a variation of the first program, in case one of the operands is allowed to be entered as two separate two-digit numbers, as proposed somewhere else in this thread: ```00 { 47-Byte Prgm } 01>LBL "MLTC" 02 STO 01 03 0 04 STO 00 05 CLX 06 2.099 07 Rv 08>LBL 00 09 RCL+ 01 10 STO IND ST T 11 ISG ST T 12 GTO 00 13 RCL IND ST Z 14 RCL IND ST Z 15 1.1 16 Rv 17>LBL 01 18 RCL+ ST Y 19 ISG ST T 20 GTO 01 21 END ``` Examples: ```12 ENTER 34 ENTER 5678 XEQ MLTC --> 7,006,652 99 ENTER ENTER 9999 XEQ MLTC --> 99,980,001 ``` Gerson. P.S.: Programs #1 and #3 require the allocation of 100 numbered registers: `Shift MODES \/ SIZE 0100 ` Edited: 27 Feb 2012, 5:39 p.m. Re: RPN Programming exercise (HP-42S) - Marcus von Cube, Germany - 02-27-2012 I was missing AIP. Used instead of ARCL it would have saved the problems with the 1000s separator or the decimal point. Otherwise, my program wouldn't need big changes.