poj2764 樹根

題目見此:http://poj.grids.cn/practice/2764

描述

數根可以通過把一個數的各個位上的數字加起來得到。如果得到的數是一位數,那麼這個數就是數根。如果結果是兩位數或者包括更多位的數字,那麼再把這些數字加起來。如此進行下去,直到得到是一位數爲止。
比如,對於24來說,把2和4相加得到6,由於6是一位數,因此6是24的數根。再比如39,把3和9加起來得到12,由於12不是一位數,因此還得把1和2加起來,最後得到3,這是一個一位數,因此3是39的數根。


輸入
輸入包括一些正整數(小於10^1000),每個一行。輸入的最後一行是0,表示輸入的結束,這一行不用處理。


輸出
對每個正整數,輸出它的數根。每個結果佔據一行。


樣例輸入
24
39
0
樣例輸出
6
3


解題思路與題目描述相同。算法實現的關鍵點在於m_length、m_positon兩個輔助變量的設置。通過這兩個變量,從而不需使用額外的空間。

代碼如下:

/************
*problem:  poj2764
*author:   lance
*code_time: 2013-6-17 11:12:53
*************/
#include <cstdio>
#include <cstring>

class Num
{
private:
    char m_num[1010];//存儲變換前及變換後十進制數
    int m_length;   //存儲上一輪數字的末尾位置
    int m_positon;    //存儲新一輪的數字的末尾位置
    
public:
    bool getNum()
    {
        scanf("%s", m_num);
        m_length = strlen(m_num);
        for (int i = 0; i < m_length; i++)
            m_num[i] -= '0';
        if (m_length == 1 && m_num[0] == 0)
            return false;
        else
            return true;
    }
    
    //將原來上一輪數字的m_num[ith]加到新的數的m_num[0],並做進位操作
    void add(int ith)
    {
        m_num[0] += m_num[ith];
        int i = 0;
        while (m_num[i] > 9)
        {
            i++;
            if (i <= m_positon)
            {
                m_num[i]++;
                m_num[i-1] %= 10;
            }
            else
            {
                m_num[i] = 1;
                m_num[i-1] %= 10;
                m_positon++;    
                break;
            }
        }
    }

    void computRoot()
    {
        while (m_length > 1)
        {
            //新數字總是從0開始
            m_positon = 0;
            //依次將上一輪數字1~m_length-1位置的數加到新的數字中
            for (int i = 1; i < m_length; i++)
                add(i);
            m_length = m_positon + 1;
        }
    }
    
    void output() 
    {
        printf("%d\n", m_num[0]);
    }    
};

int main()
{
    Num number;
    while (number.getNum())
    {
        number.computRoot();
        number.output();
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章