输出最少经过几步可以得到回文数
2017-05-25 16:28
267 查看
题目:
若一个数(首位不为0)从左到右读与从右到左读都是一样,这个数就叫做回文数,例如12521就是一个回文数。给定一个正整数,把它的每一个位上的数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,如果不是,则重复这个操作,直到和为回文数为止。给定的数本身不为回文数。例如:87则有: STEP1: 87+78=165 STEP2: 165+561=726 STEP3: 726+627=1353 STEP4: 1353+3531=4884 编写一个程序输入M(12<=M<=100),输出最少经过几步可以得到回文数。 如果在8步以内(含8步)不可能得到回文数,则输出0。
下面是我写的程序代码:#include<iostream> using namespace std; int backnum(int x) { //实现数字倒排 int r, m = 0; while (x > 0) { r = x % 10; m = 10 * m + r; x = x / 10; } /*该算法应记住,经常用来求倒序数字*/ return m; } bool isPalindrome(int x) { //判断是否为回文数 bool h = false; int r, m = 0, k; k = x; while (x>0) { r = x % 10; m = 10 * m + r; x = x / 10; } if (k == m) h = true; //必须用“==”,不能用”=“ return h; } int fun( 4000 int M) { int b, k = 0; do { b = backnum(M); M = M + b; k++; } while (!(isPalindrome(M))); //逻辑判定出错,应为! return k; } int main() { int M, k; cout << "请输入12-100中的一个整数:"; cout << endl; cin >> M; k = fun(M); if (k <= 8) cout << k << endl; else cout << "0" << endl; return 0; }
值得注意的是,fun函数中的这一段代码:
do { b = backnum(M); M = M + b; k++; } while (!(isPalindrome(M)));
应特别注意是!(isPalindrome(M))。
相关文章推荐
- 判断字符串是否可以通过交换相邻字符得到回文字符串,如果可以输出最少交换次数
- poj 1947 树形dp(求一颗树最少经过几次剪枝,可以得到特定大小的子树)
- 智力题:25个人,每5个人一个跑道,最少经过几次比赛,得到前三名
- 华为机试样题解析:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。 编写程序,任意输入两个站点名称,输出最少需要经过的站点数
- 已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量.
- 【hdu 5945 】 【dp+单调队列优化】Fxx and game【求数x最少经过多少次变换能变为1,(1)如果x%k==0,那么可以x=x/k。(2)x=x-i,(1<=i<=t)】
- 给定一个字符串,切分该字符串,使得到的子串都是回文字符串,计算最少的切分次数。
- 比如你给它任意一个正整数,它可以按照一定的运算规则, 计算出得到1的最少操作次数。
- poj1159 —— 一个字符串,求最少插入几个字符可以组成回文
- POJ 1159 添加最少几个字符可以成回文
- 交换最少次数得到回文
- 第五题:n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1
- php里拼接字符串成为一个变量,并且可以输出
- 移植Linux-2.6.22 到S3C2440的开发板上可以通过printk输出了
- 【草根总结】软件质量可以得到明显提高的10个环节
- 求最长回文字符串并原样输出
- tyvj 1088 给出长度为N的数列{A_i},每次可以从最左边或者最右边取走一个数,第i次取数得到的价值是i * A_j。求价值之和最大的取数方案。
- 《剑指offer》输出最长回文子串
- hascode 之 如何判断两个数是否可以颠倒数字顺序得到
- 输出1000以内的素数,回文数,回文素数,逆素数