入门 · 数位

数字之和

读一个正整数,输出各位数字之和:12345 → 1+2+3+4+5 = 15。拆位模式第三次登场 — 现在它应该开始变得眼熟了。

一句话答案用 sum += n % 10 和 n /= 10 反复拆位累加,直到 n 为 0 —— 这个拆位套路能把任何数位题变成一个循环。

题目

输入: 一个正整数 N(1 ≤ N ≤ 10⁹)。

输出: N 的各位数字之和。

样例:

输入输出
1234515
10001

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。

卡住了?提示

提示 1 — 模式再来一遍

n % 10 弹出末位,n / 10 切掉它。数一数位数里你在数刀数,反转数字里你把它接回去 — 这次只是把每位加进累加器。

提示 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;
}