【問題描述】利克瑞爾數(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);
}
}
}
