入门 · 循环 + 整数运算

数一数位数

读一个正整数,输出它有几位。初学者题库里最有用的小技巧登场:用 / 10 和 % 10 把数字一位一位切下来。

一句话答案用 while 循环反复除以 10,每除一次计数加一,直到 N 变成 0 —— 后面所有数位题都复用这个循环骨架。

题目

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

输出: N 的位数。

样例:

输入输出
123455
71

你的解答

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

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

卡住了?提示

提示 1 — 拆位模式

n % 10 拿到最后一位;n / 10 把它切掉(整数除法!见为什么 7/2=3)。12345 变 1234 再变 123……直到 0。数一数切了几刀。

提示 2 — 选对循环

事先不知道要循环几次 — 这是 while 的活:while (n > 0) { count++; n /= 10; }。对比for 与 while 指南:次数未知 → while。

题解(先自己试试!)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int count = 0;
    while (n > 0) {
        count++;
        n /= 10;
    }
    cout << count << endl;
    return 0;
}

这个拆位模式是下一题的一半 — 数字之和用同样的两步换了个用途。这就是算法思维:模式会重组。

深度解析

为什么这样做对

除以 10 剥掉最后一位,取模 10 读出最后一位。这一对 / 10 和 % 10 就是全部拆位技巧的基础,本站一半的题都在用它。

代价

O(d),d 是位数。int 最多 10 位,实际等于常数。

常见错法

  • while (n > 0) 遇到 n = 0 会返回 0 位。零要单独给答案。
  • log10(n) + 1 看着聪明,但在 0 上崩、在整十整百的浮点误差上错。

下一步

把剥下来的数字加起来:数字之和。

记住这两句

  • / 10 剥位,% 10 读位。
  • 零是所有拆位循环的边界杀手。
🐞 这段是错的 —— 点开,亲手让它挂一次

while (n >= 10) 少算了一位

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int count = 0;
    while (n >= 10) {
        n /= 10;
        count++;
    }
    cout << count << endl;
    return 0;
}