top1编程
← 返回题目
题解

判断数字位数

1 条题解

  • 0
    @ 2026-8-5 23:54:04

    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