Description
一個正整數,如果從左向右讀(稱之為正序數)和從右向左讀(稱之為倒序數)是一樣的,這樣的數就叫回文數。
任取一個正整數,如果不是回文數,將該數與他的倒序數相加,若其和不是回文數,則重復上述步驟,一直到獲得回文數為止。
例如:
68變成154(68+86),再變成605(154+451),最後變成1111(605+506),而1111是回文數。
於是有數學家提出一個猜想:
不論開始是什麼正整數,在經過有限次正序數和倒序數相加的步驟後,都會得到一個回文數。至今為止還不知道這個猜想是對還是錯。
現在請你編程序驗證之。
Input
每行一個正整數。
Output
對應每個輸入,輸出一行為變換的過程。
Sample Input
27228
Sample Output
27228--->109500--->115401--->219912
Hint
1.輸入的數據保證小於2^60
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 bool ishuiwen(string s) 6 { 7 for(int i=0;i<s.length()/2;i++) 8 { 9 if(s[i]!=s[s.length()-1-i]) 10 return 0; 11 } 12 return 1; 13 } 14 15 string Add(string s) 16 { 17 string sum,x; 18 for(int i=0;i<s.length();i++) 19 x[i]=s[s.length()-i-1]; 20 int len=s.length(); 21 int *a=new int[len+1]; 22 a[0]=0; 23 int d=0; 24 for(int i=s.length();i>=1;i--)//從最低位開始計算兩個數各位的和,保存到結果數組 25 a[i]=s[i-1]+x[i-1]-'0'-'0';//a[1]為計算後結果的最高位,進位情況還未處理 26 for(int i=s.length();i>=0;i--)//處理進位情況 27 { 28 a[i]+=d;//本位加上上一位的進位 29 if(a[i]>=10)//當該位大於等於10時,只保留該位的個位 ,向下一位的進位d為十位 30 { 31 d=a[i]/10; 32 a[i]%=10; 33 } 34 else if(a[i]<10)//當該位小於10是,向高位的進位為0 35 d=0; 36 } 37 if(a[0]>0) 38 for(int i=0;i<s.length()+1;i++) 39 sum+=a[i]+'0'; 40 else 41 for(int i=0;i<s.length();i++) 42 sum+=a[i+1]+'0'; 43 return sum; 44 } 45 46 int main() 47 { 48 string s; 49 while(cin>>s) 50 { 51 cout<<s; 52 while(!ishuiwen(s)) 53 { 54 s=Add(s); 55 cout<<"--->"<<s; 56 } 57 cout<<endl; 58 } 59 return 0; 60 }