【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; // 正常结束程序
}
核心逻辑解析
-
输入变量的类型选择:
- 使用
unsigned int
类型来存储正整数,可以确保输入不能为负数。
- 使用
-
循环结构:
- 使用
do-while
循环,保证至少执行一次,即使输入的数字是 0 或 1 也能正确统计位数。
- 使用
-
计数方法:
- 通过每次循环
count++
来统计循环次数。 - 通过
number /= 10
将数字缩小 10 倍,逐位减少,直到数字变为 0。
- 通过每次循环
-
输出结果:
- 最终输出
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;
}
老师代码逻辑解析
-
变量定义:
- 使用
int
类型存储输入变量,支持正整数和负整数的输入。 - 定义
cnt
变量记录数字的位数。
- 使用
-
循环过程:
- 在每次循环中,先对数字进行整除
n = n / 10
,然后计数cnt++
。 - 使用
do-while
循环确保至少执行一次。
- 在每次循环中,先对数字进行整除
-
退出条件:
- 当数字
n
缩小至 0 时,退出循环。
- 当数字
-
输出结果:
- 最终输出
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;
}
改进点
-
变量类型限制:
- 使用
unsigned int
确保输入为正整数,避免负数的干扰。
- 使用
-
逻辑简洁性:
- 将老师代码中分离的更新与判断逻辑结合,减少冗余代码,提高效率。
-
可读性:
- 结合了我的代码的紧凑风格和老师代码的清晰结构,既适合初学者理解,又简洁高效。
💯扩展思路
使用字符串方式解决
如果允许使用字符串,可以直接利用字符串长度来统计位数:
#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))。
缺点:
- 依赖于数学库函数,可能存在浮点数精度问题。
💯小结
通过本文的详细解析,我们不仅分析了如何统计正整数的位数,还通过对比不同代码实现,总结了其优缺点,并提出了改进方案。无论是初学者还是有经验的程序员,都可以根据需求选择适合的实现方式。
重点总结:
- 学会使用
do-while
循环来确保至少执行一次。 - 根据题目需求选择合适的变量类型和输入范围限制。
- 对于特殊情况(如大整数),可以采用字符串或数学方法解决。
希望通过这篇文章,读者能够更深入地理解数字处理的思路和优化方法,并在未来的编程中灵活应用。