回文数

来源:互联网 发布:手机淘宝ios历史版本 编辑:程序博客网 时间:2024/06/01 09:19
问题描述
  若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
  例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
  又如:对于10进制数87:
  STEP1:87+78 = 165 STEP2:165+561 = 726
  STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
  在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
  写一个程序,给定一个N(2<=N<=10或N=16)进制数M(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。
  如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入格式
  两行,N与M
输出格式
  如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)
样例输入
9
87
样例输出
STEP=6
import java.util.*;public class Main9 {public static String N, str;public static int sum = 0;public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner(System.in);N = sc.next();str = sc.next();search(N, str);}// 查询回文数public static void search(String des, String array) {char[] n = N.toCharArray();char[] arrays = array.toCharArray();// 连续加三十次,查看是否存在回文数for (int i = 0; i <= 30; i++) {if (is_huiwen(arrays)) {System.out.println("STEP=" + i);return;} else {arrays = add(arrays, n);}}// 不存在回文数System.out.println("Impossible!");}// 判断该字符数组是否为回文public static boolean is_huiwen(char[] arr) {for (int i = arr.length - 1; i >= arr.length / 2; i--) {// System.out.println(arr[i] + " " + arr[arr.length - i - 1]);if (arr[i] != arr[arr.length - i - 1]) {return false;}}return true;}// 相加public static char[] add(char[] st, char[] jin) {int tmp = 0;int j;if (jin.length > 1) {j = Integer.parseInt("" + jin[0] + jin[1]);} elsej = jin[0] - '0';// 保存结果char[] tmps = new char[st.length + 1];int sum;for (int i = 0; i < st.length; i++) {if (j == 16) {sum = (int) (st[i] > '9' ? st[i] - 55 : st[i] - '0')+ (int) (st[st.length - i - 1] > '9' ? st[st.length - i- 1] - 55 : st[st.length - i - 1] - '0') + tmp;} elsesum = (st[i] - '0') + (st[st.length - i - 1] - '0') + tmp;tmp = sum / j;int yus = sum % j;tmps[i] = (char) (sum % j >= 10 ? yus + 55 : yus + '0');}// 假如有进位则返回进位的数组if (tmp != 0) {tmps[tmps.length - 1] = (char) (tmp + '0');return tmps;}// 假如最高位没有进1,则保存原始的长度,避免有前导零char[] retemp = new char[tmps.length - 1];for (int i = 0; i < retemp.length; i++) {retemp[i] = tmps[i];}return retemp;}}

0 0