(TOJ1228)回文数猜想

描述

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

 

你可能感兴趣的:(回文)