星空
题意分析¶
本题要求判断一个超大数字是否是 3 的倍数。
由于该数字可能非常大(最多可达 $10^5$ 位),已经超过了 int
或 long long
的表示范围,因此不能直接用整型变量存储,只能以字符串形式读入和处理。
解题思路¶
本题可以借助一个数学结论来高效判断:
一个数字的各位数字之和是 3 的倍数,则这个数字本身是 3 的倍数。
步骤如下:¶
- 将输入以字符串的形式读取;
- 遍历整个字符串,将每一位数字累加,得到该数的“数位和”;
sum = sum + (s[i] - '0')
减去字符 $0$ 得到真正的数字。
- 判断这个数位和是否为 3 的倍数:
- 是,则输出
Yes
; - 否,则输出
No
。
- 是,则输出
数据范围说明¶
int
的最大值约为 $2 \times 10^9$(最多可存 10 位数字);long long
的最大值约为 $9 \times 10^{18}$(最多可存 19 位数字);- 而本题输入的数字位数最大为 $10^5$,远远超过了整型的表示范围;
- 所以必须将输入当作字符串处理。
时间复杂度分析¶
- 遍历字符串求数位和的时间复杂度为:$O(n)$,其中 $n$ 是数字的位数;
- 空间复杂度为 $O(1)$,只需记录一个整数变量用于累加即可。
总结¶
- 本题考察大数处理以及数学中关于整除的基础性质;
- 面对位数极大的数字,应使用字符串进行处理;
- 熟记各类整型类型的最大表示范围有助于判断是否需要切换数据结构。