文章目录
- 💯前言
- 💯题目描述
- 题目名称:BC89 包含数字9的数
- 💯代码实现与分析
- 代码结构详解
- 💯代码执行逻辑示例
- 💯优化与改进
- 改进版代码
- 改进点详解
- 💯概念拓展与优化思路
- 💯小结
💯前言
- 在C++学习过程中,面对各种实际问题的编程实现是提升逻辑思维和代码能力的重要途径。今天我们要分析的是一道题目:统计从1到2019之间,所有包含数字9的数的个数。这道题目看似简单,但蕴含了关于循环、条件判断以及效率优化的知识点。本文将从题目描述开始,逐步分析解题思路,解释代码实现,并通过优化与拓展,帮助读者全面掌握这类问题的解决方法。
C++ 参考手册
💯题目描述
BC89 包含数字9的数
题目名称:BC89 包含数字9的数
描述:
今年是2019年,KiKi想知道1~2019中有多少个包含数字9的数。包含数字9的数是指有某一位是“9”的数,例如“2019”、“199”等。
输入描述:
无。
输出描述:
一行,一个整数,表示1~2019中共有多少个数包含数字9。
💯代码实现与分析
以下是针对题目的一份初步代码实现:
#include <iostream>
using namespace std;int main()
{int count = 0;for(int i = 1; i <= 2019; i++){int temp = i;while(temp){if(temp % 10 == 9){count++;break;}temp /= 10;}}cout << count << endl;return 0;
}
代码结构详解
-
计数器初始化
int count = 0;
定义一个变量
count
来记录满足条件的数字个数,初始值设为0。 -
遍历所有数字
for(int i = 1; i <= 2019; i++)
使用
for
循环从1遍历到2019,逐一检查每个数字是否包含数字9。 -
逐位检查数字
int temp = i; while(temp) {if(temp % 10 == 9){count++;break;}temp /= 10; }
- 先将当前数字
i
赋值给变量temp
,避免直接修改原变量。 - 通过
while(temp)
循环逐位检查数字:- 使用
temp % 10
取出当前数字的个位。 - 判断个位是否等于9,若满足条件,则计数器
count
加1,并使用break
终止检查。 - 使用
temp /= 10
移除最后一位数字,继续检查更高位,直到temp
为0。
- 使用
- 先将当前数字
-
输出结果
cout << count << endl;
输出最终统计结果,即1到2019之间所有包含数字9的数字个数。
💯代码执行逻辑示例
以数字199为例,说明代码的具体执行过程:
-
初始赋值:
i = 199
temp = 199
-
逐位检查:
- 第一次循环:
temp % 10 = 9
,满足条件。count++
,计数器加1。- 使用
break
跳出循环。
- 因为已经找到数字9,不需要继续检查。
- 第一次循环:
-
继续下一数字:
i
增加1,重复以上步骤。
💯优化与改进
虽然原代码已经能够正确解决问题,但在命名和复用性上可以进一步优化。此外,可以通过将判断逻辑提取到函数中,使代码更加清晰、模块化。
改进版代码
#include <iostream>
using namespace std;// 判断一个数字是否包含9
bool containsNine(int number) {while (number) {if (number % 10 == 9) {return true;}number /= 10;}return false;
}int main() {int countOfNine = 0;for (int i = 1; i <= 2019; i++) {if (containsNine(i)) {countOfNine++;}}cout << countOfNine << endl;return 0;
}
改进点详解
-
函数化判断逻辑
- 将检查一个数字是否包含数字9的逻辑封装成独立函数
containsNine
。 - 优点:增强代码复用性,可在其他范围或场景下直接调用。
- 将检查一个数字是否包含数字9的逻辑封装成独立函数
-
更好的变量命名
- 将
temp
改为number
,更直观表达该变量的含义。 - 将
count
改为countOfNine
,体现其用途。
- 将
-
逻辑更加清晰
- 主程序中仅负责调用
containsNine
函数,并更新计数器countOfNine
。 - 判断逻辑集中在独立函数中,易于阅读和维护。
- 主程序中仅负责调用
💯概念拓展与优化思路
-
取模运算与整除运算
temp % 10
用于取出当前数字的个位。temp /= 10
用于移除最后一位。- 这是处理数字逐位分析的常用方法,效率较高。
-
跳出循环的意义
- 使用
break
在找到数字9后立即退出循环,避免多余的检查。 - 在某些场景下,提前退出可以大幅提升效率。
- 使用
-
算法复杂度
- 时间复杂度为
O(n * m)
,其中n
是数字范围(2019),m
是每个数字的位数。 - 对于1到2019的范围,该算法足够高效。
- 时间复杂度为
-
其他可能的优化方法
- 使用字符串处理:将数字转换为字符串,判断是否包含字符’9’。
- 优点:代码简洁,容易实现。
- 缺点:相较于取模运算,字符串操作效率略低。
- 示例代码:
#include <iostream> #include <string> using namespace std;int main() {int count = 0;for (int i = 1; i <= 2019; i++) {if (to_string(i).find('9') != string::npos) {count++;}}cout << count << endl;return 0; }
- 使用字符串处理:将数字转换为字符串,判断是否包含字符’9’。
💯小结
通过这道题,我们学习了如何逐位检查数字的每一位,并掌握了与数字处理相关的常用方法,如取模运算和整除运算。通过优化代码,我们将判断逻辑函数化,提高了代码的可读性和复用性。此外,还探讨了使用字符串处理的替代方法,为问题的解决提供了多种视角。
这道题不仅是对基本编程技能的考察,也是对代码规范性与效率的实践。希望读者能够通过本文的分析,深入理解数字处理的技巧,并在实际编程中灵活应用。
感谢阅读,希望对你的学习有所帮助!
学习C++是一段既充满挑战又令人收获颇丰的旅程。作为一门历史悠久且广泛应用的编程语言,C++不仅提供了强大的功能,还以其复杂性闻名。因此,在学习这门语言的过程中,我深刻体会到了它的深度和广度,同时也总结了一些心得,希望对未来的学习者有所帮助。
初识C++:从基础开始
在接触C++之前,我对编程的了解仅限于一些基础的概念,例如变量、循环和条件语句。C++的学习从这些最基本的部分开始,帮助我夯实了编程的基础。C++的语法严格,这在一开始可能会让人感到不适应,但也正是因为这种严格性,它迫使我养成了良好的编程习惯。例如,必须明确变量的类型,让我更注重程序的逻辑性和可读性。
掌握面向对象编程思想
C++最具特色的部分之一就是面向对象编程(OOP)。初次接触类和对象时,我对这种编程范式感到新奇而又困惑。OOP的核心思想是将现实世界中的事物抽象为类,通过类的实例化生成对象,从而以更直观的方式管理程序的复杂性。
我记得刚开始学习类时,写了一个关于"学生管理系统"的小程序。通过定义"学生"类,设置姓名、学号和成绩等属性,再为类添加一些方法,如打印信息和计算平均分,我逐渐理解了OOP的实际应用价值。这种封装、继承和多态的思想让我感受到C++的强大,也让我认识到软件设计中的灵活性。
理解指针与内存管理
如果说C++中有什么让我印象最深刻且花费最多时间去理解的内容,那一定是指针和内存管理。指针是C++的一大特色,同时也是许多初学者的难点。我在学习过程中经常因为指针的误用导致程序崩溃,甚至遇到一些难以调试的问题。
为了更好地理解指针,我专门阅读了一些资料,并亲手编写了许多练习程序。例如,我通过编写动态数组、链表和二叉树等数据结构,深刻体会到了指针在动态内存分配中的重要性。通过这些实践,我不仅掌握了指针的使用,还学会了如何使用new
和delete
进行内存管理,以及如何避免内存泄漏。
学习STL的便利性
C++的标准模板库(STL)是学习过程中的一个亮点。STL提供了许多现成的数据结构和算法,例如向量(vector
)、队列(queue
)、栈(stack
)以及哈希表(unordered_map
)等。在学习STL之前,我花了大量时间自己实现这些数据结构,而STL的出现大大简化了我的开发过程。
通过学习STL,我认识到了高效代码的重要性,也学会了如何快速解决问题。例如,在一次编程竞赛中,我需要快速实现一个排序功能,而STL中的sort
函数帮助我节省了大量时间。与此同时,我还了解了STL背后的一些实现原理,例如迭代器的使用和时间复杂度的分析。
错误与调试:不可避免的成长
在学习C++的过程中,错误和调试是不可避免的。无论是编译错误还是运行时错误,几乎每次编写代码时都要面对各种各样的问题。这让我一开始感到沮丧,但随着经验的积累,我学会了如何分析错误信息并快速定位问题。
调试工具是我的好帮手。例如,使用gdb
调试器让我能够逐行检查代码的执行过程,而现代的集成开发环境(IDE)如Visual Studio则提供了更直观的调试界面。此外,我还养成了在代码中添加日志和断点的习惯,这些技巧帮助我在处理复杂问题时更加得心应手。
提升编程效率的技巧
随着对C++的深入学习,我也总结了一些提升编程效率的技巧:
- 模块化编程:将代码分成多个文件,使得每个模块专注于完成特定的任务,从而提高代码的可读性和可维护性。
- 注重代码规范:遵循一致的命名规则和缩进风格,让代码更易于理解。
- 利用C++11/14/17的新特性:例如,
auto
关键字简化了变量类型的声明,智能指针(std::shared_ptr
和std::unique_ptr
)帮助更安全地管理内存。 - 多阅读优秀代码:通过阅读开源项目中的代码,我学到了很多实用的编程技巧和设计模式。
总结与展望
学习C++不仅让我掌握了一门编程语言,更让我养成了严谨的思维方式。在这个过程中,我学会了如何从问题中总结经验,如何不断优化自己的代码,以及如何以更高效的方式解决实际问题。
未来,我希望能够继续深入学习C++的高级特性,例如模板编程和多线程开发,同时也希望能够将C++应用于更多实际项目中,如游戏开发、嵌入式系统和高性能计算。我相信,通过不断的实践和学习,我将在C++的世界中发现更多的乐趣和可能性。
总之,C++是一门值得花时间深入学习的语言。尽管它的学习曲线较陡,但正是这种挑战让我更加热爱编程,也让我在每次克服困难后获得了巨大的成就感。