題目見此: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;
}