判断数字位数
1 条题解
-
0
P4611 判断数字位数(入门)
解题思路
这道题可以用"剥洋葱"的办法一步一步想清楚。
第一步,明确题目要求。 题目让我们写一个函数
get_length(),输入一个正整数,输出它一共有几位。比如数字 123456 有 6 位,数字 7 有 1 位,数字 0 也有 1 位。第二步,想一个"数位数"的好办法。 一个数字有几位,就看它连续除以 10 几次才会变成 0。就像剥洋葱,每除以一次 10,就剥掉最外面的一层"皮"(最右边的数字),剥到没有为止。数一数剥了几层,就知道有几位。比如 123456 除以 10 变成 12345,再除以 10 变成 1234……一直剥到 0,一共剥了 6 层,所以它有 6 位。再比如两位数 58:除以 10 变成 5,再除以 10 变成 0,剥了 2 层,所以是 2 位。
第三步,用循环和计数器实现。 函数里用一个 while 循环,只要数字还大于 0,就把计数器 digitCnt 加一,然后让数字除以 10。循环结束时,计数器的值就是位数。
第四步,处理特殊情况。 0 虽然不在"正整数"范围里,但题目要求单独考虑:0 是一位数,直接返回 1 即可。另外,题目说数字不超过 10 位,10 位数(比如 9999999999)已经超过 int 能存的最大值约 21 亿,所以函数参数和主程序的变量都要用 long long 类型,保证不溢出。
第五步,写主程序收尾。 主程序读入一个数字,调用 get_length() 得到位数,直接输出。最小正整数 1 只有 1 位,最大的 10 位数有 10 位,不管数字多大,只要不断除以 10,都能准确数出位数,代码既短又可靠。
**回顾总结。**整个思路就是"反复除以 10,用计数器记次数":除以 10 的次数就是位数。这个办法对一位数、两位数乃至十位数统统适用,唯一的特例是 0 要单独返回 1,数字太大要用 long long 保存。以后遇到"数位数""数有几个数字"之类的题目,都可以用这个剥洋葱的办法。
参考代码
// 判断数字位数:计算输入的正整数有多少位 #include <iostream> using namespace std; // 计算正整数 num 的位数(num 不超过 10 位,用 long long 存储) int get_length(long long num) { int digitCnt = 0; // 位数计数器 if (num == 0) return 1; // 特殊处理:0 只有 1 位 while (num > 0) { digitCnt++; // 每去掉一位,计数器加一 num /= 10; // 去掉最右边的数字 } return digitCnt; } int main() { long long number; cin >> number; // 读入数字(最大 10 位,超过 int 范围,用 long long) cout << get_length(number) << endl; return 0; }复杂度分析
每次除以 10,数字就少一位,所以循环执行的次数等于数字的位数,最多 10 次,时间复杂度是 O(log₁₀n),也就是以 10 为底 n 的对数,n 是输入的数字本身。程序只用了一个计数器,空间复杂度是 O(1)。无论输入多大,程序都能瞬间完成。
- 1