【问题描述】
利克瑞尔数(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
【样例2说明】
输入的非利克瑞尔数为909,其本身为回文数,直接输出,没有迭代过程。
C++代码如下(菜鸟一枚,大佬勿喷):
#include<iostream>
using namespace std;
bool check(int x)//此函数是判断是否是回文数
{
int sum1=0;
int x1=x;//此表达式意义是将一个变量的值赋给另一个变量,前提是必须保证该变量有具体的值
while(x1>0)
{
sum1=sum1*10+x1%10;
x1/=10;
}
if(sum1==x) return true;
else return false;
}
int output(int y)//此函数是返回一个数的逆序数
{
int sum2=0;
while(y>0)
{
sum2=sum2*10+y%10;
y/=10;
}
return sum2;
}
//以下是主函数部分
int main()
{
int n,i;//i变量记录迭代次数
cin>>n;
if(check(n))
{
cout<<n;
}//先判断最简单的情况,一开始输入的就是一个回文数,直接输出即可
else
{
for(i=1;;i++)
{
printf("%d:%d+%d=%d\n",i,n,output(n),n+output(n));
if(check(n+output(n)))//循环退出条件,一定要有,这个就是判断第一次迭代之后相加的数
break;
else
{
n=n+output(n);//更新n的值以便进入下一次循环
}
}
cout<<n+output(n);
}
return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/54606.html