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));
}
}
|