CF102B Sum of Digits 题解

Content

给定一个数 \(n\),每次操作可以将 \(n\) 变成 \(n\) 各位数之和。问你几次操作之后可以将 \(n\) 变为一位数。

数据范围:\(1\leqslant n\leqslant 10^{10^5}\)

Solution

一看这么大个数字我们就不能够用 intlong long 之类的类型读入了,只能够用字符串、字符数组。然后考虑将所有的数位暴力拆开求和,然后再代入求出操作后的数字,直到变成一位数为止。

Code

请注意下面的代码需要特判是否本来就是一位数。

const int N = 1e5 + 7;
int digit[N], tmp[N], tmp2[N], sum, ans;

inline int td(char x) {return x - '0';}

int main() {
	crstr(s, n);
	if(n == 1) return printf("0"), 0;
	F(i, 0, n - 1) digit[i + 1] = td(s[i]);
	while(1) {
		memset(tmp, 0, sizeof(tmp));
		memset(tmp2, 0, sizeof(tmp2));
		sum = 0;	//Clear all!!! 
		F(i, 1, n) sum += digit[i];
		while(sum) {
			tmp[++tmp[0]] = sum % 10;
			sum /= 10;
		}
		R(i, tmp[0], 1) tmp2[i] = tmp[tmp[0] - i + 1];
		memset(digit, 0, sizeof(digit));
		F(i, 1, tmp[0]) digit[i] = tmp2[i];
		n = tmp[0], ans++;
		if(n == 1) break;
	}
	return write(ans), 0;
} 
posted @ 2021-12-16 11:40  Eason_AC  阅读(53)  评论(0)    收藏  举报