@TOC
各位之和
时间限制:1秒
空间限制:128M
题目描述
小码哥超厉害,可以把任意的数通过一次操作变成它的各个数位上的数字之和。
现在小码哥找来了一个数n,请问操作几次之后可以变成一个一位数。
输入描述
输入包含一个整数 $n$
数据范围
$1 <= n <= 10^{100000}$
输出描述
输出一行一个数表示答案
样例一
输入
输出
题目分析
直接按照要求,进行模拟即可。
其实看到$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
|
#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