藍橋杯:練習題:迴文數
阿新 • • 發佈:2018-12-16
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; } }