入门 · 数位
数字之和
读一个正整数,输出各位数字之和:12345 → 1+2+3+4+5 = 15。拆位模式第三次登场 — 现在它应该开始变得眼熟了。
一句话答案用 sum += n % 10 和 n /= 10 反复拆位累加,直到 n 为 0 —— 这个拆位套路能把任何数位题变成一个循环。
题目
输入: 一个正整数 N(1 ≤ N ≤ 10⁹)。
输出: N 的各位数字之和。
样例:
| 输入 | 输出 |
|---|---|
12345 | 15 |
1000 | 1 |
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。
卡住了?提示
提示 2 — 循环终点
while (n > 0) — 任何正数除以 10 足够多次后都会到 0。到 0 时,累加器里就是答案。
题解(先自己试试!)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int s = 0;
while (n > 0) {
s += n % 10;
n /= 10;
}
cout << s << endl;
return 0;
}
数位工具箱集齐了:数、加、反。练习变体:数字之积,或"7 这个数字出现过吗"(循环里加个 if)。相关阅读:整数除法。
深度解析
为什么这样做对
同样的剥位,换一个累加器。能看出「新题 = 老循环 + 新循环体」,正是这整个题库在训练的能力。
代价
O(d),int 下 d ≤ 10。循环次数取决于位数,不取决于数值大小。
常见错法
- 忘了写除法(一直
n % 10)就是死循环,会把这个标签页卡死。 - C++ 里
-123 % 10是-3,负数的各位之和会算出负数。先取abs。
下一步
把剥下来的位存起来倒着拼:反转数字。
记住这两句
- C++ 负数取模得负数——先 abs()。
- 新题老循环:变的只有循环体。
🐞 这段是错的 —— 点开,亲手让它挂一次
该用 % 的地方写成了 /
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int sum = 0;
while (n > 0) {
sum += n / 10;
n /= 10;
}
cout << sum << endl;
return 0;
}