code for fun

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

描述

一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如: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 }

 

posted on 2013-05-14 11:27  xueda120  阅读(504)  评论(0编辑  收藏  举报