利克瑞尔数
【问题描述】利克瑞尔数(Lychrel Number)指的是将该数各数位逆序翻转后形成的新数相加,并将该过程反复迭代后,结果永远无法是一个回文数的自然数。57就是一个非利克瑞尔数:57+75=132, 132+231=363,363是一个回文数。请编写程序,输入一个自然数(非利克瑞尔数),请计算其最终的回文数是多少及每次迭代过程。注意:假设输入的整数和中间产生的整数都不超过int数据类型的表示范围。
【输入形式】从标准输入读入一个正整数。
【输出形式】在标准输出上输出迭代过程和最终的回文数。分行输出每次迭代过程:先输出迭代次数(从1开始计数),后跟英文冒号:,然后是两数相加等于某数的等式,其中的符号都是英文符号,没有空格。在最后一行输出最终得到的回文数。若输入的整数本身就是回文数,则不输出任何迭代过程,直接输出该回文数。
【样例输入】109
【样例输出】
1:109+901=1010
2:1010+101=1111
1111
【样例说明】
输入:
909
输出:
909
c++代码:
#include <iostream>
using namespace std;
int main(){
int a,b,c,i,e;
int item;
int n=0;
int num;
int d=0;
int f=0;
cin>>num;
a=num;
b=0;
while(a!=0){
c=a%10;
b=b*10+c;
a=a/10;
}
if(num==b){
cout<<num<<endl;
}else{
for(item=1;n==d;item++){
n=num+b;
i=n;
cout<<item<<":"<<num<<"+"<<b<<"="<<n<<endl;
while(i!=0){
e=i%10;
d=d*10+e;
i=i/10;
f=d+n;
}
}cout<<item<<":"<<n<<"+"<<d<<"="<<f<<endl;
cout<<f<<endl;
}
return 0;
}
java代码:
修改之后:
package fuxi;
import java.util.Scanner;
public class W {
static int nixu(int n) {
int g,r=0,a=n;
while(a!=0) {
g=a%10;//g是个位数
r=r*10+g;//r是逆序数,如果逆序数等于n,即验证数是回文数
a=a/10;//a从百十个一一遍历,算到0为止
}
return r;
}
public static void main(String[] args) {
Scanner inScanner=new Scanner(System.in);
int n=inScanner.nextInt();
int r=nixu(n);
if(r==n) {System.out.print(n);}//输出回文数,比如909
/*输入109
1:109+901=1010
2:1010+101=1111
1111*/
else
{int p=n+r;//n是原数109,r是逆序数901,p是1010
int i=1;
while(p!=nixu(p))//需要判断第一次迭代之后的数是否为回文数,是就while循环结束直接输出
{
System.out.println(i+":"+n+"+"+r+"="+p);//1:109+901=1010
n=p;
r=nixu(p);
i++;
break;
}
System.out.println(i+":"+n+"+"+r+"="+(n+r));//2:1010+101=1111
System.out.println(n+r);
}
}
}