1. 程式人生 > >藍橋杯:練習題:迴文數

藍橋杯:練習題:迴文數

package lanqiaobei;

import java.util.Scanner;

/*
練習題:迴文數
一個正整數,如果交換高低位以後和原數相等,那麼稱這個數為迴文數。比如 121,2332 都是迴文數,13,456713,4567 不是迴文數。
任意一個正整數,如果其不是迴文數,將該數交換高低位以後和原數相加得到一個新的數,如果新數不是迴文數,重複這個變換,直到得到一個迴文數為止。例如,57 變換後得到 132(57+75),132 得到 363(132+231),363是一個迴文數。
曾經有數學家猜想:對於任意正整數,經過有限次上述變換以後,一定能得出一個迴文數。至今這個猜想還沒有被證明是對的。現在請你通過程式來驗證。
輸入格式
輸入一行一個正整數n。
輸出格式
輸出第一行一個正整數,表示得到一個迴文數的最少變換次數。
接下來一行,輸出變換過程,相鄰的數之間用"--->"連線。輸出格式可以參見樣例。
保證最後生成的數在 int 範圍內。
樣例輸入
349
樣例輸出
3
349--->1292--->4213--->7337
 */
public class HuiWenNumber {
    static int cont=0;
    static StringBuffer re=new StringBuffer("");
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        char[] ns=(n+"").toCharArray();
        jia(ns,n);
        System.out.println(cont);
        System.out.println(re.toString());
    }
    //遞迴累加用while也可以
    public static void jia(char[] ns,int n){
        re.append(n);
        if (juge(ns)){
         return;
        }else {
            cont++;
            int m=0;
            for (int i = 0; i <ns.length ; i++) {
                m+=(ns[i]-48)*(Math.pow(10,i));
            }
            int r=m+n;
            re.append("--->");
            char[] newr=(r+"").toCharArray();
            jia(newr,r);
        }

    }
    //判斷是否為迴文數字
    public static boolean juge(char[] ns){
        int mid=ns.length/2;
        boolean res=true;
        int left=0;
        int right=0;
        if (ns.length%2==0){
                    right=ns.length/2;
                    left=(ns.length-1)/2;
            while (left>=0&&right<ns.length){
                if (ns[left]==ns[right]){
                    res=res&&true;
                    left--;
                    right++;
                }else {
                    res=res&&false;
                    break;
                }
            }
        }else {
            while (left>=0&&right<ns.length){
                right=ns.length/2+1;
                left=ns.length/2-1;
                if (ns[left]==ns[right]){
                    res=res&&true;
                    left--;
                    right++;
                }else {
                    res=res&&false;
                    break;
                }
            }
        }
        return res;
    }
}