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 }