任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得到一个新的数,如果新数是回文数, 重复这个变换,直到得到个回文数为止。例如,57变换后得到132(57+75),132得到363(132 + 231),363 是一个回文数。
曾经有数学家猜想:对于任意正整数,经过有限次上述变换以后,一定能得出一个回文数。至今这个猜想还没有被证明是对的。现在请你通过程序来验证。
输入格式
输入一行一个正整数n。
输出格式
输出第一行一个正整数,表示得到一个回文数的最少变换次数。
接下来一行,输出变换过程,相邻的数之间用“–>”连接。输出格式可以参见样例。
保证最后生成的数在int范围内
样例输入:
349
样例输出:
3
349–>1292–>4213–>7337
#include <iostream>
#include <cmath>
using namespace std;
int a[1005];//计产生的新数
int sfshw(int x)//判断是否为回文数
{
int c=0,i=0,y=0,m=x;
int b[1005];
while(x>0)
{
b[i]=x%10;
x/=10;
c++;
i++;
}
for(i=0;i<c;i++)
{
y+=b[i]*pow(10,c-i-1);
}
if(m==y)
{
return 1;
}
else
{
return 0;
}
}
int bhh(int x)//求变换后的数
{
int c=0,i=0,y=0;
int b[1005];
while(x>0)
{
b[i]=x%10;
x/=10;
c++;
i++;
}
for(i=0;i<c;i++)
{
y+=b[i]*pow(10,c-i-1);
}
return y;
}
int main()
{
int n,w=0,i=0;//w是变换次数
cin>>n;
if(sfshw(n))//如果输入的数是回文数,直接输出
{
cout<<w<<endl<<n<<endl;
}
a[0]=n;
while(!sfshw(n))//如果输入的数不是回文数的情况
{
n+=bhh(n);//加上变换后的数得到一个新的数
w++;
a[++i]=n;
}
cout<<w<<endl;
for(i=0;i<=w;i++)
{
if(i!=w)
{cout<<a[i]<<"-->";}
else
{
cout<<a[i]<<endl;
}
}
return 0;
}