题目:
一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数。比如 121,2332 都是回文数,13,456713,4567 不是回文数。
任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得到一个新的数,如果新数不是回文数,重复这个变换,直到得到一个回文数为止。例如,57 变换后得到 132(57+75),132 得到 363(132+231),363是一个回文数。
曾经有数学家猜想:对于任意正整数,经过有限次上述变换以后,一定能得出一个回文数。至今这个猜想还没有被证明是对的。现在请你通过程序来验证。
输入格式
输入一行一个正整数n。
输出格式
输出第一行一个正整数,表示得到一个回文数的最少变换次数。
接下来一行,输出变换过程,相邻的数之间用"—>"连接。输出格式可以参见样例。
保证最后生成的数在 int 范围内。
样例输入
349
样例输出
3
349—>1292—>4213—>733
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[15];
int b[1000];
int is_huiwen(int n)
{
int k = 0,sum = 0,digit,len = 0,m = n;
memset(a,0,sizeof(a));
while(n > 0){
a[k++] = n % 10;
n /= 10;
}
for(int i = k - 1;i >= 0;i--){
digit = 1;
for(int j = 0;j < len;j++) digit *= 10;
len++;
sum += a[i] * digit;
}
if(sum == m) return 0;
else return sum;
}
int main()
{
int n,num = 1;
cin >> n;
b[0] = n;
while(1){
if(!is_huiwen(n)) break;
else b[num] = is_huiwen(n) + n;
n = b[num++];
}
cout << num - 1 << endl;
for(int i = 0;i < num;i++){
if(i) cout << "--->" << b[i];
else cout << b[i];
}
cout << endl;
return 0;
}
刚输入一个值先判断是否位回文数,如果不是就将那个倒过来的数加上其本身,再次判断,直到是回文数退出循环,在这期间每一个新数都要用数组保存。(直接看代码吧!)