2011年7月22日 星期五

c015: Reverse and Add

內容 :
    把一個數字反轉並相加的方法很簡單:就是把數字反轉並加上原來的數字。假如這個和不是一個迴文(指這個數字從左到右和從右到左都相同),就一直重複這個程序。舉例說明:

195 開始的數字
591
-----
786
687
-----
1473
3741
-----
5214
4125
-----
9339 迴文出現了

    在這個例子中,經過了4次相加後得到了迴文9339。幾乎對所有的整數這個方法都會得到迴文,但是也有有趣的例外。196是第1個用這個方法找不到迴文的數字,然而並沒有證明該迴文不存在。
    現在給你一個開始的數字,你的任務就是求出經過多少次相加後,會產生哪一個迴文。對所有的測試資料,你可以假設:1. 都會有1個答案。2. 在1000個相加內都會得到答案。 3. 產生的迴文不會大於4294967295.

輸入說明 :
    第1列有一個整數N(0 < N <= 100),代表以下有幾組測試資料。每筆測試資料一列,各有1個整數 P,就是開始的數字。

輸出說明 :
    對每一測試資料,請輸出2個數字:得到迴文所需的最少次數的相加,以及該迴文。

範例輸入 :
5
195
265
750
2
99

範例輸出 :
4 9339
5 45254
3 6666
1 4
6 79497

出處 :
    ACM 10018

程式碼 :
#include<stdio.h>
#include<string.h>

int main()
{
    int i,k,n,len,lenhalf,addtimes,check;
    char s[1000000];
    
    scanf("%d",&n);
    for(k=0; k<n; k++)
    {
        scanf("%s",s);
        addtimes = 0;
        check = 1;
        
        len = strlen(s);
        for(i=0; i<len; i++)
            s[i] = s[i] - 48;
        
        while(check)
        {
            addtimes++;
                       
            if(len % 2)
                lenhalf = len / 2 + 1;
            else
                lenhalf = len / 2;
            for(i=0; i<lenhalf; i++)
            {
                s[i] = s[i] + s[len-i-1];
                s[len-i-1] = s[i];
            }
                        
            for(i=0; i<len; i++)
            {
                if(s[i] > 9)
                {
                    s[i+1]++;
                    s[i] = s[i] - 10;
                }
            }
            if(s[i] != '\0')
            {
                i++;
                s[i] = '\0';
                len = i;
            }            
            
            check = 0;
            lenhalf = (len=i)/2 + 1;
            for(i=0; i<lenhalf; i++)
            {
                if(s[i] != s[len-i-1])
                {
                    check = 1;
                    break;
                }
            }            
        }
        for(i=0; i<len; i++)
            s[i] = s[i] + 48;
        printf("%d %s\n",addtimes,s);
    }    
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=c015

沒有留言:

張貼留言