Mega Code Archive

 
Categories / Java / Data Type
 

Compute the Palindrome of a number by adding the number composed of

import java.math.BigInteger; /** Compute the Palindrome of a number by adding the number composed of  * its digits in reverse order, until a Palindrome occurs.  * e.g., 42->66 (42+24); 1951->5995 (1951+1591=3542; 3542+2453=5995).  * <P>TODO: Do we need to handle negative numbers?  * @author Ian Darwin, http://www.darwinsys.com/  * @version $Id: PalindromeBig.java,v 1.3 2004/02/09 03:33:57 ian Exp $.  */ public class PalindromeBig {   public static boolean verbose = true;   public static void main(String[] argv) {     for (int i=0; i<argv.length; i++)       try {         BigInteger l = new BigInteger(argv[i]);         if (l.compareTo(BigInteger.ZERO) < 0) {           System.err.println(argv[i] + " -> TOO SMALL");           continue;         }         System.out.println(argv[i] + "->" + findPalindrome(l));       } catch (NumberFormatException e) {         System.err.println(argv[i] + "-> INVALID");       } catch (IllegalStateException e) {         System.err.println(argv[i] + "-> " + e);       }    }   /** find a palindromic number given a starting point, by    * calling ourself until we get a number that is palindromic.    */   public static BigInteger findPalindrome(BigInteger num) {     if (num.compareTo(BigInteger.ZERO) < 0)       throw new IllegalStateException("negative");     if (isPalindrome(num))       return num;     if (verbose)       System.out.println("Trying " + num);     return findPalindrome(num.add(reverseNumber(num)));   }   /** A ridiculously large number  */   protected static final int MAX_DIGITS = 255;   /** Check if a number is palindromic. */   public static boolean isPalindrome(BigInteger num) {     String digits = num.toString();     int numDigits = digits.length();     if (numDigits >= MAX_DIGITS) {       throw new IllegalStateException("too big");     }     // Consider any single digit to be as palindromic as can be     if (numDigits == 1)       return true;     for (int i=0; i<numDigits/2; i++) {       // System.out.println(       //   digits.charAt(i) + " ? " + digits.charAt(numDigits - i - 1));       if (digits.charAt(i) != digits.charAt(numDigits - i - 1))         return false;     }     return true;   }   static BigInteger reverseNumber(BigInteger num) {     String digits = num.toString();       int numDigits = digits.length();     char[] sb = new char[numDigits];     for (int i=0; i<digits.length(); i++) {       sb[i] = digits.charAt(numDigits - i - 1);     }     // Debug.println("rev",     //   "reverseNumber(" + digits + ") -> " + "\"" + sb + "\"");     return new BigInteger(new String(sb));   } }