题目:一个正整数,如果高低位交换和原数相等,那么称这个数为回文数。
问题:任意一个正整数,如果其不是回文数,将该数高低位以后和原数相加得到一个新的数,如果不是回文数,重复这个变换,直到得到一个回文数为止。
例如 :57变换后得到132(57+75),132得到363(132+231),363是一个回文数。
曾经有数学家猜想:对于任意正整数,经过有限次上述变换以后,一定得出一个回文数。至今这个猜想还没有被证明是对的。现在请你通过程序来验证。
输入格式
输入一行一个正整数n。
输出格式
输出第一行一个正整数,表示得到一个回文数的最少变换次数。
接下来一行,输出变换过程,相邻的数之间用“—>”连接。
保证最后的生成数在int范围类
样例输入
349
样例输出
3
349—>1292—>4213—>7337
代码如下:
#include<iostream>
using namespace std;
int arr[1005];
int shu[1005];
bool judge(int x)
{
int cnt = 0;
while(x){
shu[cnt++] = x % 10;
x /= 10;
}
for(int c = 0; c < cnt / 2; c++){
if(shu[c] != shu[cnt-1-c])
return false;
}
return true;
}
int rev(int x)
{
int ret = 0;
while(x){
ret=ret*10+x%10;
x/=10;
}
return ret;
}
int main( )
{
int n;
cin>>n;
int kaishi=n;
int a = 0;
while(!judge(n)){
n+=rev(n);
arr[a]=n;
a++;
}
cout<<a<<endl;
cout<<kaishi;
for(int b = 0; b < a;b++){
cout<<"--->"<<arr[b];
}
return 0;
`
- 分析题目
首先是需要判定回文数,那么需要手写一个判定回文数的函数,但题目并不是判定一个数是不是回文数,而是求一个非回文数变换到回文数的过程。所以变换的过程也需要考虑。
- 算法–判断回文数:
将一个数的每一位提取并存下来,然后将高位和低位比较即可
bool judge(int x)
{
int cnt = 0;
while(x){
shu[cnt++] = x % 10;
x /= 10;
}
for(int c = 0; c < cnt / 2; c++){
if(shu[c] != shu[cnt-1-c])
return false;
}
return true;
}
- 算法–变换回文数
定义一个数ret = 0。将要求的数x每一位取余然后加到ret中,每次ret都将原来的大小乘以10,那么当x为0时循环结束。返回ret即可。
int rev(int x)
{
int ret = 0;
while(x){
ret=ret*10+x%10;
x/=10;
}
return ret;
}
- 输出格式
按照题目要求在求回文数的过程中将回文数存入数组中,再输出原来的数n。然后在每个输出前加上“—>”。
while(!judge(n)){
n+=rev(n);
arr[a]=n;
a++;
}
cout<<a<<endl;
cout<<kaishi;
for(int b = 0; b < a;b++){
cout<<"--->"<<arr[b];
}
来源:CSDN
作者:weixin_45719527
链接:https://blog.csdn.net/weixin_45719527/article/details/104618525