回文數猜想
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5576 Accepted Submission(s): 3353
Problem Description 一個正整數,如果從左向右讀(稱之為正序數)和從右向左讀(稱之為倒序數)是一樣的,這樣的數就叫回文數。任取一個正整數,如果不是回文數,将該數與他的倒序數相加,若其和不是回文數,則重複上述步驟,一直到獲得回文數為止。例如:68變成154(68+86),再變成605(154+451),最後變成1111(605+506),而1111是回文數。于是有數學家提出一個猜想:不論開始是什麼正整數,在經過有限次正序數和倒序數相加的步驟後,都會得到一個回文數。至今為止還不知道這個猜想是對還是錯。現在請你程式設計式驗證之。
Input 每行一個正整數。
特别說明:輸入的資料保證中間結果小于2^31。
Output 對應每個輸入,輸出兩行,一行是變換的次數,一行是變換的過程。
Sample Input
27228
37649
Sample Output
3
27228--->109500--->115401--->219912
2
37649--->132322--->355553
剛看到的時候感覺很難,然後一分析,發現還是可以解決的,然後就開始做了....
主要是完全模拟這個過程,注意狀态的記錄和元素的處理,詳細看代碼注釋.....
剛開始沒仔細分析題目,寫的代碼比較繁瑣,浪費了很多無用的操作.....
不知道怎麼判斷回文數字,就轉化為字元處理了....
#include<stdio.h>
#include<string.h>
int judge(int x)//判斷是否回文
{
char s[32];
int len=sprintf(s,"%d",x);
for(int i=0;i<len/2;++i)
{
if(s[i]!=s[len-i-1])
{
return 0;
}
}
return 1;
}
int change(int x)//改變這個值為他自身加上翻轉之後的數...
{
int sum=0,n=x;
while(n)
{
sum=sum*10+n%10;
n/=10;
}
return x+sum;
}
void slove(int x)
{
int s[1005],cnt=0;
s[0]=x;
while(!judge(x))//如果不回文,繼續處理
{
x=change(x);//改變
s[++cnt]=x;//記錄
}
printf("%d\n",cnt); //先輸出次數
for(int i=0;i<cnt;++i)//輸出每次變換的值
{
printf("%d--->",s[i]);
}
printf("%d\n",s[cnt]);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
slove(n);
}
return 0;
}
然後再次分析,發現自己想多了...不需要這麼麻煩的.....
隻需要求出這個數的翻轉之後的,和本身比較,相等那麼就是回文的數了,否則就不是,而且正好下面的處理需要翻轉之後的結果,這樣就不會浪費了處理....
#include<stdio.h>
int change(int x)//轉化
{
int sum=0,n=x;
while(n)
{
sum=sum*10+n%10;
n/=10;
}
return sum;//這是颠倒之後的值
}
void slove(int x)
{
int s[1005],cnt=0,n=change(x);
s[0]=x;
while(n!=x)//判斷是否回文
{
x+=n;//改變
s[++cnt]=x;//記錄
n=change(x);//轉化
}
printf("%d\n",cnt);
for(int i=0;i<cnt;++i)//輸出
{
printf("%d--->",s[i]);
}
printf("%d\n",s[cnt]);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
slove(n);
}
return 0;
}