問題描述 :
有一天,明明在做數學作業的時候,發現了一組很有趣的數字。例如1、11、121、1331等等。他發現這些數字都是左右對稱的,即不管你把這些數字從左讀到右還是從右讀到左,讀出來的數字都是一樣的。於是明明就把這個發現告訴了他爸爸。明明的爸爸是一名數學專家,他當然對這種類型的數字早有研究,他對明明說:“這些是迴文數,它是一種特殊的數字現象,即這些數字的左右兩邊是對稱的。例如:121左右兩邊對稱,1331左右也是對稱的。”明明覺得這很有趣,接着問他爸爸還有什麼和這類迴文數有關的好玩的東西,明明的爸爸於是就教了明明一種方法,這種方法是從任意一個整數出發,經過某種計算,就可以得到一個迴文數。 這個方法如下: 例如首先給你一個數19,然後把它的最低位與最高位交換(如果還有更多位,則次低位與次高位交換…),得到它的逆序數91,然後兩數相加,即19+91=110,我們得到110,因爲110不是迴文數,因此我們繼續上面的步驟,110+11=121,現在我們就得到了一個迴文數121。通過這種方法,我們就可以求得一個與某一個整數有關的迴文數。 明明很聰明,很快就掌握了這個方法,但是他也發現了一個問題,就是有時候計算一個迴文數,需要重複很多次以上的步驟,這使得明明很煩惱。於是他就求助於你,請你幫他寫一個程序,通過程序來完成以上求迴文數的過程。
明明的問題可以歸結爲:給你一個整數,通過上面敘述的求迴文數的方法,求出迴文數,並輸出求解過程。輸入數據保證該回文數小於2^31
輸入說明 :
你寫的程序要求從標準輸入設備中讀入測試數據作爲你所寫程序的輸入數據。標準輸入設備中有多組測試數據,每組測試數據僅佔一行,每行有一個整數n(10≤n≤10000),即要求迴文數的那個整數。當n=0時,表示輸入結束。每組測試數據與其後一組測試數據之間沒有任何空行,第一組測試數據前面以及最後一組測試數據後面也都沒有任何空行。
輸出說明 :
對於每一組測試數據,你寫的程序要求計算出一組相應的運算結果,並將這一組運算結果作爲你所寫程序的輸出數據依次寫入到標準輸出設備中。每組運算結果爲一行或多行的迴文數求解過程,直到求出迴文數爲止。每行的格式如下a+b=c,其中a是原來的數,b是a的交換後的那個數,c是a+b的結果,詳細格式請參考輸出樣例。每組運算結果與其後一組運算結果之間沒有任何空行,第一組運算結果前面以及最後一組運算結果後面也都沒有任何空行。 注:通常,顯示屏爲標準輸出設備。
輸入範例 :
88
0
輸出範例 :
88+88=176
176+671=847
847+748=1595
1595+5951=7546
7546+6457=14003
14003+30041=44044
c源碼:
#include<stdio.h>
#include<stdlib.h>
int fun( int n)
{
int i,j,t=0,a[100],x,y;
x=n;
while(x>0)
{ y=x%10;
a[t]=y;
t++;
x=x/10;
}
i=0;
j=t-1;
while(i<j)
{
if(a[i]!=a[j])
return 0;
i++;
j--;
}
return 1;
}
int main()
{
int i,j,x,y,s,n,t,a[100]={0};
scanf("%d",&n);
while(n!=0)
{
memset(a,0,100);
while(1)
{t=0;
x=n;
while(x>0)
{ y=x%10;
a[t]=y;
t++;
x=x/10;
}
y=0;
y=a[0];
for(i=1;i<t;i++)
{ y=y*10;
y=y+a[i];
}
s=n+y;
printf("%d+%d=%d\n",n,y,s);
if(fun(s)==1)
break;
else
n=s;
}//while 1
scanf("%d",&n);
}//scanf
return 0;
}