【C++】统计正整数的位数:题目解析与代码优化



博客主页:[小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C++


文章目录



💯前言

  • 在 C++ 编程学习中,数字的处理是一个基础但非常重要的环节。今天,我们来详细解析一道非常经典的题目:统计一个正整数的位数。这道题目既简单又直观,同时通过不同代码实现方式的对比,能够帮助我们更好地理解循环结构、变量的选择,以及优化代码的思路。以下内容将涵盖题目要求、我的代码实现、老师提供的代码,以及两者的对比分析和优化方法,并扩展出更为通用的解决方案。希望通过本文的详细解读,读者能收获一些实用的编程技巧。
    C++ 参考手册

💯题目描述

题目要求:统计正整数的位数

输入一个正整数,计算这个整数是几位数。

输入示例:

  • 输入:1234

  • 输出:4

  • 输入:12

  • 输出:2


💯我的代码实现

以下是我的实现代码:

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    unsigned int number; // 定义无符号整数,用来存储正整数
    cin >> number;       // 从标准输入读取数字
    int count = 0;       // 定义计数变量,初始值为0

    do
    {
        count++;         // 每循环一次,说明这个数字还有至少一位
    }
    while (number /= 10); // 使用 /= 10 缩小数字,去掉最后一位

    cout << count << endl; // 输出位数
    return 0;              // 正常结束程序
}

核心逻辑解析

  1. 输入变量的类型选择

    • 使用 unsigned int 类型来存储正整数,可以确保输入不能为负数。
  2. 循环结构

    • 使用 do-while 循环,保证至少执行一次,即使输入的数字是 0 或 1 也能正确统计位数。
  3. 计数方法

    • 通过每次循环 count++ 来统计循环次数。
    • 通过 number /= 10 将数字缩小 10 倍,逐位减少,直到数字变为 0。
  4. 输出结果

    • 最终输出 count,即为数字的位数。

💯老师的代码实现

以下是老师的代码:

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int cnt = 0;
    do
    {
        n = n / 10;
        cnt++;
    } while (n);

    cout << cnt << endl;
    return 0;
}

老师代码逻辑解析

  1. 变量定义

    • 使用 int 类型存储输入变量,支持正整数和负整数的输入。
    • 定义 cnt 变量记录数字的位数。
  2. 循环过程

    • 在每次循环中,先对数字进行整除 n = n / 10,然后计数 cnt++
    • 使用 do-while 循环确保至少执行一次。
  3. 退出条件

    • 当数字 n 缩小至 0 时,退出循环。
  4. 输出结果

    • 最终输出 cnt,即为数字的位数。

💯我的代码与老师代码的对比

通过对比,可以更清晰地了解两种实现方式的异同。

对比点 我的代码 老师代码
变量类型 使用 unsigned int,限制输入为正整数 使用 int,允许输入负数
计数方式 count++ 在数字缩小前进行 cnt++ 在数字缩小后进行
输入变量初始化 仅定义变量 number 初始化变量 n = 0
循环退出条件 条件中直接进行数字缩小操作 number /= 10 单独更新数字,退出条件为 n == 0
可读性 紧凑简洁,逻辑集中 条理清晰,便于初学者理解
安全性 更严格限制输入范围 可能接收非法输入(负数或非数字)

💯代码优化与改进

结合两种代码的优点,我们可以设计出以下优化版本:

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    unsigned int number; // 限定为正整数
    cin >> number;       // 输入数字
    int count = 0;       // 初始化计数器

    do {
        count++;         // 增加位数
        number /= 10;    // 去掉最后一位数字
    } while (number);    // 当数字不为0时继续循环

    cout << count << endl; // 输出结果
    return 0;
}

改进点

  1. 变量类型限制

    • 使用 unsigned int 确保输入为正整数,避免负数的干扰。
  2. 逻辑简洁性

    • 将老师代码中分离的更新与判断逻辑结合,减少冗余代码,提高效率。
  3. 可读性

    • 结合了我的代码的紧凑风格和老师代码的清晰结构,既适合初学者理解,又简洁高效。

💯扩展思路

使用字符串方式解决

如果允许使用字符串,可以直接利用字符串长度来统计位数:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string number;
    cin >> number;
    cout << number.length() << endl; // 输出字符串长度
    return 0;
}

优点

  • 能够处理非常大的数(如超过 unsigned int 范围的数)。
  • 逻辑更直观,无需手动对数字进行处理。

缺点

  • 使用了 string,需要额外的空间。

数学方法:使用 log10

如果数字是正整数,可以通过数学公式计算位数:

cpp 复制代码
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    unsigned int number;
    cin >> number;
    int count = log10(number) + 1; // log10(n) + 1 即位数
    cout << count << endl;
    return 0;
}

优点

  • 代码非常简洁。
  • 时间复杂度更低(O(1))。

缺点

  • 依赖于数学库函数,可能存在浮点数精度问题。

💯小结


  • 通过本文的详细解析,我们不仅分析了如何统计正整数的位数,还通过对比不同代码实现,总结了其优缺点,并提出了改进方案。无论是初学者还是有经验的程序员,都可以根据需求选择适合的实现方式。

重点总结:

  1. 学会使用 do-while 循环来确保至少执行一次。
  2. 根据题目需求选择合适的变量类型和输入范围限制。
  3. 对于特殊情况(如大整数),可以采用字符串或数学方法解决。

希望通过这篇文章,读者能够更深入地理解数字处理的思路和优化方法,并在未来的编程中灵活应用。



相关推荐
学习前端的小z10 小时前
【C++】2029:【例4.15】水仙花数
c
学习前端的小z15 小时前
【C++】探索一维数组:从基础到深入剖析
c
oioihoii18 小时前
VSCode下配置Blazor环境 & 断点调试Blazor项目
ide·python·c
肆——18 小时前
PTA数据结构作业一
c
charlie1145141911 天前
从0开始的Opencv之旅(到尝试构建一个图像编辑器):0,opencv demo
c++·图像处理·opencv·学习·c·教程
这题怎么做?!?3 天前
const与constexpr
c++·c
青草地溪水旁3 天前
strncpy函数和使用案例
c·strncpy
我要出家当道士6 天前
Nginx单向链表 ngx_list_t
数据结构·nginx·链表·c
学习前端的小z12 天前
【C++】小乐乐求和问题的高效求解与算法对比分析
c