首页 > ACM题库 > HDU-杭电 > HDU 1282 回文数猜想[解题报告] C++
2013
12-04

HDU 1282 回文数猜想[解题报告] C++

回文数猜想

问题描述 :

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

输入:

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

输出:

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

样例输入:

27228
37649

样例输出:

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

解题报告:

有一种猜想,即任意的一个数,将它和它的倒序数相加,经过若干次操作之后,一定能得到一个回文数,倒序数是指把这个数倒过来表示的数字,如123的倒序数就是321,现在要你判断给定的一个n 要经过多少次操作才能得到一个回文数,并且输出操作的过程,即输出每次相加后得到的结果,所以只要写两个函数,一个是用来判断这个数是否是回文数,另一个是用来判断这个数的倒序数,就OK了。

#include<cstdio>
 bool judge(int k) {          //判断是不是回文数 
     int i = 0,x[10005];      
     while(k) {            //将数先存到数组里面 
         x[i++] = k%10;
         k/=10;
     }
     for(int j = 0;j<i;++j)
     if(x[j] != x[i-j-1])
     return false;
     return true;
 }
 int oper(int k) {       //求数k的倒序数 
     int ans = 0;
     while(k) {
         ans *= 10;
         ans += (k%10);
         k /= 10;
     }
     return ans;
 }
 int main() {
     int n,jilu[1005];
     while(scanf("%d",&n)!=EOF) {
         jilu[0] = n;   //将原来的数先存起来 
         int f = 0;     //计数器 
         while(!judge(n)) {
             n += oper(n);
             jilu[f+1] = n;
             f++;
         }
         printf("%d\n%d",f,jilu[0]);
         for(int i = 1;i<=f;++i)
         printf("--->%d",jilu[i]);
         printf("\n");
     }
     return 0;
 }

 


  1. 很高兴你会喜欢这个网站。目前还没有一个开发团队,网站是我一个人在维护,都是用的开源系统,也没有太多需要开发的部分,主要是内容整理。非常感谢你的关注。

  2. 我还有个问题想请教一下,就是感觉对于新手来说,递归理解起来有些困难,不知有没有什么好的方法或者什么好的建议?

  3. 思路二可以用一个长度为k的队列来实现,入队后判断下队尾元素的next指针是否为空,若为空,则出队指针即为所求。