一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数。
比如 121 121 121, 2332 2332 2332 都是回文数, 13 13 13, 4567 4567 4567 不是回文数。
任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得到一个新的数,如果新数不是回文数,重复这个变换,直到得到一个回文数为止。
例如, 57 57 57 变换后得到 132 ( 57 + 75 ) 132(57 + 75) 132(57+75), 132 132 132 得到 363 ( 132 + 231 ) 363(132 + 231) 363(132+231), 363 363 363 是一个回文数。
曾经有数学家猜想:对于任意正整数,经过有限次上述变换以后,一定能得出一个回文数。
至今这个猜想还没有被证明是对的。
现在请你通过程序来验证。
输入格式
输入一行一个正整数 n n n。
输出格式
输出第一行一个正整数,表示得到一个回文数的最少变换次数。
接下来一行,输出变换过程,相邻的数之间用"—>"连接。
输出格式可以参见样例。
保证最后生成的数在 int 范围内。
样例输入
349
样例输出
3
349—>1292—>4213—>7337
解:
判断流程
1.保存判断的数,判断是否是回文数
1.1是,cout<<判断次数<<endl,cout<<所有数;
1.2否,判断次数++,把该数加上翻转的数后,继续判断
代码:
#include"iostream"
#include"vector"
#include"cmath"
#include"algorithm"
using namespace std;
int c=0;//次数
vector<int> v;//数
void judge(int a)
{
int time=0;//用来判断是否是回文数
int flag=0;//计算a的位数
int a1=a;
while(a1%10||a1/10)
{
flag++;
a1/=10;
}
time=0;
for(int i=0;i<flag/2;i++)//判断
{
if((a/int(pow(10.0,i)))%10==(a/int(pow(10.0,flag-1-i)))%10)
time++;
}
if(time==flag/2)///是回文数
{
cout<<c<<endl;
for(vector<int>::iterator it=v.begin();it!=v.end();it++)//输出
{
if(it!=v.end()-1)
cout<<*it<<"--->";
else
cout<<*it;
}
}
else//不是
{
c++;
int temp=0;//储存翻转后的数
for(int i=0;i<flag;i++)//加自身反转后的数
{
temp+=(a/int(pow(10.0,i))%10*pow(10.0,flag-1-i));
}
a+=temp;
v.push_back(a);
judge(a);
}
}
int main()
{
int a;
cin>>a;
v.push_back(a);
judge(a);
return 0;
}