题目描述
看过上一部哈利波特电影后,小杰拉德也决定练习魔法。他在父亲的魔法书中发现了一个咒语,可以将任何数字变成数字的总和。杰拉德得知这一点的那一刻,他遇到了一个数字 n
。杰拉德可以给它施法多少次,直到数字变成一位数?
数据范围
0 ≤ n ≤ 1 0 10000 0 \le n \le 10^{10000} 0≤n≤1010000
分析
算法:模拟
如果不是一位数,就将所有位上的数字加和,注意第一次加和之后不会爆 int
,因为假设所有位数上的数字都为 9
,加和也才 900000
,然后再对 10
取模加和,统计一下次数。
需要特判一下一位数,cnt = 0
。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
char num[N];
int main()
{
scanf("%s", num + 1);
vector<int> res;
int sum = 0, cnt = 1;
int n = strlen(num + 1);
if (n == 1)
{
cout << 0 << endl;
return 0;
}
for (int i = 1; i <= n; i ++ )
sum += num[i] - '0';
while (sum >= 10)
{
cnt ++ ;
while (sum) res.push_back(sum % 10), sum /= 10;
for (auto s : res) sum += s;
res.clear();
}
cout << cnt << endl;
return 0;
}