回文数:设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。
任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得到一个新的数,如果新数不是回文数,重复这个变换,直到得到一个回文数为止。例如,57变换后得到132(57+75),132得到363(132+231),363是一个回文数
输入格式:
输入一行一个正整数n。
输出格式:
输出第一行一个正整数,表示得到一个回文数的最少变换次数。
接下来一行,输出变换过程,相邻的数之间用“--->”连接。保证最后生成的数在int 范围内
#include<iostream>
using namespace std;
int num[1005];
int digit[1005];
bool judge(int x){ //写一个判断该数是不是回文数的函数,从外到内判断
int cnt=0; //定义数字有几位
while(x){
digit[cnt++]=x%10; //用10取模
x/=10;
}
for(int i=0;i<cnt/2;i++){
if(digit[i]!=digit[cnt-1-i]){ //如果对应的位不等
return false;
}
}
return true;
}
int rev(int x){ //写一个反转该数字的函数
int ret=0;
while(x){
ret=ret*10+x%10; //在后面添一位相当于乘10再加上第一位
x/=10;
}
return ret;
}
int main(){
int n,m;
cin>>n;
m=0;
num[m++]=n;
while(!judge(n)){
n+=rev(n);
num[m++]=n;
}
cout<<m-1<<endl;
for(int i=0;i<m;i++){
if(i!=m-1){ //如果不是最后一位
cout<<num[i]<<"--->"; //输出箭头图标
}
else{
cout<<num[i]<<endl;
}
}
return 0;
}
测试结果