入门 · 循环 + 整数运算
数一数位数
读一个正整数,输出它有几位。初学者题库里最有用的小技巧登场:用 / 10 和 % 10 把数字一位一位切下来。
一句话答案用 while 循环反复除以 10,每除一次计数加一,直到 N 变成 0 —— 后面所有数位题都复用这个循环骨架。
题目
输入: 一个正整数 N(1 ≤ N ≤ 10⁹)。
输出: N 的位数。
样例:
| 输入 | 输出 |
|---|---|
12345 | 5 |
7 | 1 |
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 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;
}