【问题描述】
利克瑞尔数(Lychrel Number)指的是将该数各数位逆序翻转后形成的新数相加,并将该过程反复迭代后,结果永远无法是一个回文数的自然数。57就是一个非利克瑞尔数:57+75=132, 132+231=363,363是一个回文数。请编写程序,输入一个自然数(非利克瑞尔数),请计算其最终的回文数是多少及每次迭代过程。
注意:假设输入的整数和中间产生的整数都不超过int数据类型的表示范围。
【输入形式】
从标准输入读入一个正整数。
【输出形式】
在标准输出上输出迭代过程和最终的回文数。分行输出每次迭代过程:先输出迭代次数(从1开始计数),后跟英文冒号:,然后是两数相加等于某数的等式,其中的符号都是英文符号,没有空格。在最后一行输出最终得到的回文数。
若输入的整数本身就是回文数,则不输出任何迭代过程,直接输出该回文数。
【样例1输入】
109
【样例1输出】
1:109+901=1010 2:1010+101=1111 1111
【样例1说明】
输入的非利克瑞尔数为109,经过两次迭代可得到回文数:第一次迭代为109和其逆序数901相加得1010,第二次迭代为上次迭代得到的1010加上其逆序数101(注意:高位的0省略)得1111,1111就是最终得到的回文数。
【样例2输入】
909
【样例2输出】
909
注意要点(解题方法或易错区域):
1)若输入的数即为回文数的话,就直接输出回文数
2)现在创建一个函数,用来返回逆序的数,即输入901,则该函数就用来输出109,再来在主函数中判断是否为回文数,然后输出值
3)最重要的是代码的思想,和如何操作。我们要面临着几大困难,1,我们需要输出样例输出前的序号数,2,要在最后满足回文条件时输出回文数,3,如何将第一次的1010的值放入第二次的式子中操作,4,最后不能忘记要使用换行符,输出要和样例输出一致。
#include<stdio.h>
int f(int n);
int main()
{
int i=0;
int x=0,n;
scanf("%d",&n);
if(f(n)==n)
{
printf("%d",n);
}
else
{
do
{
x=n+f(n);
i++;
printf("%d:%d+%d=%d\n",i,n,f(n),x);
n=x;
if(f(x)==x)
{
printf("%d\n",x);
}
}while(f(x)!=x);
}
}
int f(int n)
{
int sum=0,item=0;
while(n!=0)
{
item=n%10;
sum=sum*10+item;
n=n/10;
}
return sum;
}