当前位置: 首页 > news >正文

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


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目描述
    • **题目要求:统计正整数的位数**
  • 💯我的代码实现
    • **核心逻辑解析**
  • 💯老师的代码实现
    • **老师代码逻辑解析**
  • 💯我的代码与老师代码的对比
  • 💯代码优化与改进
    • **改进点**
  • 💯扩展思路
    • **使用字符串方式解决**
    • **数学方法:使用 log10**
  • 💯小结


在这里插入图片描述


💯前言

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

💯题目描述

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

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

输入示例:

  • 输入:1234

  • 输出:4

  • 输入:12

  • 输出:2


💯我的代码实现

以下是我的实现代码:

#include <iostream>
using namespace std;int main()
{unsigned int number; // 定义无符号整数,用来存储正整数cin >> number;       // 从标准输入读取数字int count = 0;       // 定义计数变量,初始值为0do{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,即为数字的位数。

💯老师的代码实现

以下是老师的代码:

#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
可读性紧凑简洁,逻辑集中条理清晰,便于初学者理解
安全性更严格限制输入范围可能接收非法输入(负数或非数字)

💯代码优化与改进

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

#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. 可读性

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

💯扩展思路

使用字符串方式解决

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

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

优点

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

缺点

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

数学方法:使用 log10

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

#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. 对于特殊情况(如大整数),可以采用字符串或数学方法解决。

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


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述


http://www.mrgr.cn/news/81786.html

相关文章:

  • K8S中,pod的创建流程
  • 2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。
  • 社媒运营专线 - SD-WAN 跨境网络专线 —— 外贸企业社媒平台的专属 “快车道”
  • python+PyMuPDF库:(一)创建pdf文件及内容读取和写入
  • 【Java】线程相关面试题 (基础)
  • C++的第一个程序
  • Python入门:7.Pythond的内置容器
  • 2-198基于Matlab-GUI的运动物体追击问题
  • 前端
  • Stable Diffusion绘画 | 电商设计海报
  • 【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结
  • 三层交换机配置
  • 003:如何理解 CNN 中的 RGB 图像和通道?
  • SpringBoot(Ⅱ)——@SpringBootApplication注解+自动装配原理+约定大于配置
  • win系统B站播放8k视频启用HEVC编码
  • 【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块
  • Wend看源码-Java-集合学习(List)
  • unity学习1:第1个template的项目platformer 学习
  • 离散数学 群(半群,群,交换群,循环群,对称群,置换群,置换,交代群,轮换)详细,复习笔记
  • khadas edge2安装ubuntu22.04与ubuntu20.04 docker镜像
  • 各种网站(学习资源、常用工具及其他,持续更新中~)
  • 【高阶数据结构】红黑树封装map、set
  • 微服务——部署与运维
  • 1.微服务灰度发布落地实践(方案设计)
  • Fast adaptively balanced min-cut clustering
  • 指针详解之 难点、易错点一次性彻底击碎!