码蹄集 - MT2201 - 各位之和

@TOC


各位之和

时间限制:1秒
空间限制:128M


题目描述

小码哥超厉害,可以把任意的数通过一次操作变成它的各个数位上的数字之和。

现在小码哥找来了一个数n,请问操作几次之后可以变成一个一位数。


输入描述

输入包含一个整数 $n$

数据范围

$1 <= n <= 10^{100000}$


输出描述

输出一行一个数表示答案


样例一

输入

1
991

输出

1
3

题目分析

直接按照要求,进行模拟即可。

其实看到$10^{100000}$不用害怕,直接把输入的数字当作字符串来处理即可。

$10^{100000}$也就是说输入的字符串的长度最大为$100000$,而$100000$个数求和最大不到$10^6$(最多$6$位)

因此很快就会收敛为一位数。完全不用担心时间问题。

字符串の各位和

字符串的各位和比较容易,直接遍历字符串,并累加每一位即可。

1
2
3
4
5
6
ll getS(string s) {
ll ans = 0;
for (char& c : s)
ans += c - '0';
return ans;
}

数字の各位和

数字的各位和也不难。在数字不为零的时候,每次取出数字的个位数,然后让数字除以$10$即可。

1
2
3
4
5
6
7
8
ll getS(ll n) {
ll ans = 0;
while (n) {
ans += n % 10;
n /= 10;
}
return ans;
}

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
* @Author: LetMeFly
* @Date: 2022-07-21 09:46:18
* @LastEditors: LetMeFly
* @LastEditTime: 2022-07-21 09:48:26
*/
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;

ll getS(string s) {
ll ans = 0;
for (char& c : s)
ans += c - '0';
return ans;
}

ll getS(ll n) {
ll ans = 0;
while (n) {
ans += n % 10;
n /= 10;
}
return ans;
}

int main() {
string s;
cin >> s;
if (s.size() == 1) {
puts("0");
return 0;
}
ll n = getS(s);
int ans = 1;
while (true) {
if (n < 10)
break;
ans++;
n = getS(n);
}
cout << ans << endl;
return 0;
}

虽然代码可以复制,但最好还是自己理解后再敲哦

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125918169


码蹄集 - MT2201 - 各位之和
https://blog.letmefly.xyz/2022/07/21/MaTiJi - MT2201 - 各位之和/
作者
Tisfy
发布于
2022年7月21日
许可协议