有一天,明明在做数学作业的时候,发现了一组很有趣的数字。例如1、11、121、1331等等。他发现这些数字都是左右对称的,即不管你把这些数字从左读到右还是从右读到左,读出来的数字都是一样的。于是明明就把这个发现告诉了他爸爸。明明的爸爸是一名数学专家,他当然对这种类型的数字早有研究,他对明明说:“这些是回文数,它是一种特殊的数字现象,即这些数字的左右两边是对称的。例如:121左右两边对称,1331左右也是对称的。”明明觉得这很有趣,接着问他爸爸还有什么和这类回文数有关的好玩的东西,明明的爸爸于是就教了明明一种方法,这种方法是从任意一个整数出发,经过某种计算,就可以得到一个回文数。 这个方法如下: 例如首先给你一个数19,然后把它的最低位与最高位交换(如果还有更多位,则次低位与次高位交换…),得到它的逆序数91,然后两数相加,即19+91=110,我们得到110,因为110不是回文数,因此我们继续上面的步骤,110+11=121,现在我们就得到了一个回文数121。通过这种方法,我们就可以求得一个与某一个整数有关的回文数。 明明很聪明,很快就掌握了这个方法,但是他也发现了一个问题,就是有时候计算一个回文数,需要重复很多次以上的步骤,这使得明明很烦恼。于是他就求助于你,请你帮他写一个程序,通过程序来完成以上求回文数的过程。
明明的问题可以归结为:给你一个整数,通过上面叙述的求回文数的方法,求出回文数,并输出求解过程。输入数据保证该回文数小于2^31
#include<stdio.h>
int b[100];
int a[100];
int res(int x)
{
int i=0;
int res=0;
while(x)
{
a[i++]=x%10;
x=x/10;
}
int num=1;
for(int j=0;j<i;j++)
{
res=res*10+a[j];
}
return res;
}
int judge(int n)
{
int i=0;
int x=0;
while(n)
{
b[i++]=n%10;
n=n/10;
x++;
}
for(int j=0;j<x;j++)
{
if(b[j]!=b[x-j-1])
return 0;
}
return 1;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0){
break;
}
int result;
result=n+res(n);
printf("%d+%d=%d\n",n,res(n),result);
while(!judge(result))
{
int c=result;
// result=c+res(c);
printf("%d+%d=%d\n",result,res(c),result+res(c));
result=c+res(c);
}
// printf("%d+%d=%d\n",n,res(n),result);
}
return 0;
}