HP Forums
Reversing an Integer's Digits - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Software Libraries (/forum-10.html)
+--- Forum: HP Prime Software Library (/forum-15.html)
+--- Thread: Reversing an Integer's Digits (/thread-18851.html)



Reversing an Integer's Digits - Eddie W. Shore - 09-20-2022 05:18 AM

What Should I Add To Reverse the Digits?

Let A, B, C, D, and E be individual digits (0-9) of an integer. AB would represent a two digit integer with the value of 10 * A + B. ABC would represent a three digit integer with the value of 100 * A + 10 * B + C.

Reversing a Two Digit Integer

AB + # = BA
10 * A + B + # = 10 * B + A
# = 9 * (B - A)

Example: Let AB = 76.
A = 7, B = 6
# = 9 * (6 - 7) = -9
76 - 9 = 67

Reversing a Three Digit Integer

ABC + # = CBA
100 * A + 10* B + C + # = 100 * C + 10 * B + A
# = 99 * (C - A)

Example: ABC = 469
# = 99 * (9 - 4) = 495
469 + 495 = 964

Reversing a Four Digit Integer

ABCD + # = DCBA
1000 * A + 100 * B + 10 * C + D + # = 1000 * D + 100 * C + 10 * B + A
# = 999 * (D - A) + 90 * (C - B)

Example: ABCD = 7219
# = 999 * (9 - 7) + 90 * (1 - 2) = 1908
7219 + 1908 = 9127

Reversing a Five Digit Integer

ABCDE + # = EDBCA
10000 * A + 1000 * B + 100 * C + 10 * D + E + # =
10000 * E + 1000 * D + 100 * C + 10 * B + A
# = 9999 * (E - A) + 990 * (D - B)

Example: ABCDE = 52693
# = 9999 * (3 - 5) + 990 * (9 - 2) = -13068
52693 - 13068 = 39625

Having the Calculator Do It

The program REVINT reverses the digits of an integer, up to 11 digits. The program does not allow numbers that have non-zero fractional parts or integers more than 11 digits. Instead of solving for # (see above), the program splits the integers into a list in reverse order, and uses list processing to get the final answer.

HP Prime Program: REVINT

Caution: Integers that end or begin with zero may not return accurate results. My suggestion is not use 0s with this program. See examples below for more details.

Code:
EXPORT REVINT(N)
BEGIN
// 2022-09-18 EWS
// reverse the integer N
// up to 12 digits
LOCAL D,P,A,I,M,L;
L:={};
P:=XPON(N);

// check size 
  IF P>11 THEN
  RETURN "TOO BIG";
  KILL;
  END;
 
// check type
  IF FP(N) THEN
  RETURN "NOT AN INTEGER";
  KILL;
  END;
   
D:=N;

// loop
  FOR I FROM P DOWNTO 0 DO
  A:=D/ALOG(I);
  L:=CONCAT({IP(A)},L);
  D:=D-IP(A)*ALOG(I); 
  END;
  
// rebuild 
M:=ΣLIST(MAKELIST(ALOG(X),X,P,0,−1)*L);
RETURN M; 
END;

Examples:

REVINT(4321) returns 1234

REVINT(56765) returns 56765 (56765 is a palindrome, reversing the digits results in the same number)

REVINT(42910) returns 1924 (01924 - be aware about integers ending or beginning with 0)

REVINT(67.28) returns "NOT AN INTEGER" (error)


RE: Reversing an Integer's Digits - Didier Lachieze - 09-20-2022 06:01 AM

Thanks for that. The addition to reverse a number is a nice trick if you have an easy way to get access to the individual digits.

Otherwise on the Prime you can also use this one liner that you can define as a user function to reverse the number N:

EXPR(CHAR(REVERSE(ASC(STRING(N)))))

It works with integers and also with positive decimal numbers, for example for 67.28 it returns 82.76

To reverse both positive and negative numbers you need:

SIGN(N)*EXPR(CHAR(REVERSE(ASC(STRING(ABS(N))))))