1. 程式人生 > >計蒜客習題:迴文數

計蒜客習題:迴文數

問題描述

一個正整數,如果交換高低位以後和原數相等,那麼稱這個數為迴文數。比如 121,2332 都是迴文數,134567 不是迴文數。

任意一個正整數,如果其不是迴文數,將該數交換高低位以後和原數相加得到一個新的數,如果新數不是迴文數,重複這個變換,直到得到一個迴文數為止。例如,57 變換後得到 132(57 + 75),132 得到 363(132 + 231),363 是一個迴文數。

曾經有數學家猜想:對於任意正整數,經過有限次上述變換以後,一定能得出一個迴文數。至今這個猜想還沒有被證明是對的。現在請你通過程式來驗證。
輸入格式
輸入一行一個正整數 n。
輸出格式
輸出第一行一個正整數,表示得到一個迴文數的最少變換次數。
接下來一行,輸出變換過程,相鄰的數之間用”—>”連線。輸出格式可以參見樣例。
保證最後生成的數在 int 範圍內。
樣例輸入


349
樣例輸出
3
349—>1292—>4213—>7337

AC程式碼

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int m[100];
int n[100];
void mycheck()
{
    for(int i=99;i>=80;i--)
    {
        if(m[i]>=10){m[i-1]+=m[i]/10;m[i]=m[i]%10;}
    }
}
int is_hui()
{
    int
cur1; int cur2=99; for(cur1=0;cur1<=99;cur1++) { if(m[cur1]!=0)break; } for(;cur1<=cur2;) { if(m[cur1]==m[cur2]){cur1++;cur2--;continue;} return 0; } return 1; } void jia() { int cur1; int cur2=99; for(;cur1<=99;cur1++) { if
(m[cur1]!=0)break; } for(;cur1<=cur2;) { m[cur1]+=m[cur2]; m[cur2]=m[cur1]; cur1++; cur2--; } mycheck(); } void pri() { int cur1=0; for(;cur1<=99;cur1++) { if(m[cur1]!=0)break; } for(;cur1<100;cur1++) { cout<<m[cur1]; } } int main() { memset (m,0,sizeof(m)); int buf[10]; int cnt=0; char mm; while(scanf("%c",&mm)==1&&mm!=10) { buf[cnt]=mm-'0'; cnt++; } for(int i=0;i<cnt;i++) { n[100-cnt+i]=buf[i]; m[100-cnt+i]=buf[i]; } int tm=0; while(!is_hui()) { tm++; jia(); }cout<<tm<<endl; for(int i=0;i<100;i++) { m[i]=n[i]; } pri(); while(!is_hui()) { jia(); cout<<"--->"; pri(); } return 0; }