杭电 1282 回文数猜想

回文数猜想

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3022    Accepted Submission(s): 1825


Problem Description
一 个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒 序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如:68变成154(68+86),再变成605(154+451),最后变成 1111(605+506),而1111是回文数。于是有数学家提出一个猜想:不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到 一个回文数。至今为止还不知道这个猜想是对还是错。现在请你编程序验证之。
 

 

Input
每行一个正整数。
特别说明:输入的数据保证中间结果小于2^31。
 

 

Output
对应每个输入,输出两行,一行是变换的次数,一行是变换的过程。
 

 

Sample Input
27228 37649
 

 

Sample Output
3 27228--->109500--->115401--->219912 2 37649--->132322--->355553
 

 

Author
SmallBeer(CML)
 

 

Source
 

 

Recommend
lcy
 
    从该题中学到两个函数,itoa与sprintf,这两个都是数字转换成字符串的函数
 
View Code
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int ispalindromic(int a)
 6 {
 7     char s[15];
 8     int len, i;
 9     sprintf(s,"%d", a);
10     len = strlen(s);
11     for( i = 0; i < len/2; i++ )
12          if( s[i] != s[len-1-i] )
13              return 0;
14     return 1;
15     
16 }
17 
18 int reverse( int a )
19 {
20     char s[15];
21     int len, k = 0, i;
22     sprintf(s,"%d",a);
23     len = strlen(s);
24     for( i = len-1; i >= 0; i-- )
25          k = k * 10 + s[i] - '0';
26     return k;
27 }
28 
29 int main(int argc, char *argv[])
30 {
31     int a, b[1000], cnt ,c, i;
32     while( scanf( "%d", &a ) != EOF )
33     {
34            cnt = 0;
35            memset(b,0,1000*sizeof(int));
36            b[cnt++] = a;
37            while( !ispalindromic(a) )
38            {
39                   c = reverse(a);
40                   b[cnt++] = a + c;
41                   a = a + c;
42            }
43            printf( "%d\n%d", cnt-1,b[0] );
44            for( i = 1; i < cnt; i++ )
45                     printf("--->%d", b[i]);
46            printf( "\n" );  
47     }
48   
49  // system("PAUSE");    
50   return 0;
51 }

 

posted @ 2013-05-08 15:26  翼展zjz  阅读(351)  评论(0编辑  收藏  举报