描述
一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如:68变成154(68+86),再变成605(154+451),最后变成1111(605+506),而1111是回文数。于是有数学家提出一个猜想:不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数。至今为止还不知道这个猜想是对还是错。现在请你编程序验证之。
输入
每行一个正整数。
特别说明:输入的数据保证中间结果小于2^31。
输出
对应每个输入,输出两行,一行是变换的次数,一行是变换的过程。
样例输入
27228
37649
样例输出
3
27228--->109500--->115401--->219912
2
37649--->132322--->355553
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<ctype.h> 5 6 int a[1000],b[1000]; 7 8 int reverse(int n) //将给定数字翻转 9 { 10 int i,s=0; 11 while(n) 12 { 13 s=s*10+n%10; 14 n=n/10; 15 } 16 return s; 17 } 18 19 int judge(int n) //判断数字是否为回文数 20 { 21 int j,i=0; 22 while(n) //取数字n的每位数字存储与数组a中 23 { 24 a[i++]=n%10; 25 n=n/10; 26 } 27 for(j=0; j<i/2; j++) //循环判断数字是否相等 28 { 29 if(a[j]!=a[i-j-1]) 30 break; 31 } 32 if(j==i/2) return 1; 33 else return 0; 34 } 35 36 void solve() 37 { 38 int n,j,flag,count; 39 while(scanf("%d",&n)!=EOF){ 40 count=flag=j=0; 41 while(!judge(n)) 42 { 43 b[j++]=n; 44 n=n+reverse(n); 45 count++; 46 flag++; 47 } 48 b[flag++]=n; 49 printf("%d\n",count); 50 printf("%d",b[0]); 51 for(j=1; j<flag; j++) //按照指定格式输出 52 printf("--->%d",b[j]); 53 printf("\n"); 54 } 55 } 56 57 int main() 58 { 59 solve(); 60 return 0; 61 }