天天看點

1282 回文數猜想【簡單模拟】回文數猜想

回文數猜想

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;
}