【C++】BC89 包含数字9的数


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目描述
    • 题目名称: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;
}

在这里插入图片描述

代码结构详解

  1. 计数器初始化

    int count = 0;
    

    定义一个变量count来记录满足条件的数字个数,初始值设为0。

  2. 遍历所有数字

    for(int i = 1; i <= 2019; i++)
    

    使用for循环从1遍历到2019,逐一检查每个数字是否包含数字9。

  3. 逐位检查数字

    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。
  4. 输出结果

    cout << count << endl;
    

    输出最终统计结果,即1到2019之间所有包含数字9的数字个数。


💯代码执行逻辑示例

以数字199为例,说明代码的具体执行过程:

  1. 初始赋值:

    • i = 199
    • temp = 199
  2. 逐位检查:

    • 第一次循环:
      • temp % 10 = 9,满足条件。
      • count++,计数器加1。
      • 使用break跳出循环。
    • 因为已经找到数字9,不需要继续检查。
  3. 继续下一数字:
    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;
}

在这里插入图片描述

改进点详解

  1. 函数化判断逻辑

    • 将检查一个数字是否包含数字9的逻辑封装成独立函数containsNine
    • 优点:增强代码复用性,可在其他范围或场景下直接调用。
  2. 更好的变量命名

    • temp改为number,更直观表达该变量的含义。
    • count改为countOfNine,体现其用途。
  3. 逻辑更加清晰

    • 主程序中仅负责调用containsNine函数,并更新计数器countOfNine
    • 判断逻辑集中在独立函数中,易于阅读和维护。

💯概念拓展与优化思路

  1. 取模运算与整除运算

    • temp % 10用于取出当前数字的个位。
    • temp /= 10用于移除最后一位。
    • 这是处理数字逐位分析的常用方法,效率较高。
  2. 跳出循环的意义

    • 使用break在找到数字9后立即退出循环,避免多余的检查。
    • 在某些场景下,提前退出可以大幅提升效率。
  3. 算法复杂度

    • 时间复杂度为O(n * m),其中n是数字范围(2019),m是每个数字的位数。
    • 对于1到2019的范围,该算法足够高效。
  4. 其他可能的优化方法

    • 使用字符串处理:将数字转换为字符串,判断是否包含字符’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;
      }
      

💯小结

通过这道题,我们学习了如何逐位检查数字的每一位,并掌握了与数字处理相关的常用方法,如取模运算和整除运算。通过优化代码,我们将判断逻辑函数化,提高了代码的可读性和复用性。此外,还探讨了使用字符串处理的替代方法,为问题的解决提供了多种视角。

这道题不仅是对基本编程技能的考察,也是对代码规范性与效率的实践。希望读者能够通过本文的分析,深入理解数字处理的技巧,并在实际编程中灵活应用。


感谢阅读,希望对你的学习有所帮助!


在这里插入图片描述


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

学习C++是一段既充满挑战又令人收获颇丰的旅程。作为一门历史悠久且广泛应用的编程语言,C++不仅提供了强大的功能,还以其复杂性闻名。因此,在学习这门语言的过程中,我深刻体会到了它的深度和广度,同时也总结了一些心得,希望对未来的学习者有所帮助。

初识C++:从基础开始

在接触C++之前,我对编程的了解仅限于一些基础的概念,例如变量、循环和条件语句。C++的学习从这些最基本的部分开始,帮助我夯实了编程的基础。C++的语法严格,这在一开始可能会让人感到不适应,但也正是因为这种严格性,它迫使我养成了良好的编程习惯。例如,必须明确变量的类型,让我更注重程序的逻辑性和可读性。

掌握面向对象编程思想

C++最具特色的部分之一就是面向对象编程(OOP)。初次接触类和对象时,我对这种编程范式感到新奇而又困惑。OOP的核心思想是将现实世界中的事物抽象为类,通过类的实例化生成对象,从而以更直观的方式管理程序的复杂性。

我记得刚开始学习类时,写了一个关于"学生管理系统"的小程序。通过定义"学生"类,设置姓名、学号和成绩等属性,再为类添加一些方法,如打印信息和计算平均分,我逐渐理解了OOP的实际应用价值。这种封装、继承和多态的思想让我感受到C++的强大,也让我认识到软件设计中的灵活性。

理解指针与内存管理

如果说C++中有什么让我印象最深刻且花费最多时间去理解的内容,那一定是指针和内存管理。指针是C++的一大特色,同时也是许多初学者的难点。我在学习过程中经常因为指针的误用导致程序崩溃,甚至遇到一些难以调试的问题。

为了更好地理解指针,我专门阅读了一些资料,并亲手编写了许多练习程序。例如,我通过编写动态数组、链表和二叉树等数据结构,深刻体会到了指针在动态内存分配中的重要性。通过这些实践,我不仅掌握了指针的使用,还学会了如何使用newdelete进行内存管理,以及如何避免内存泄漏。

学习STL的便利性

C++的标准模板库(STL)是学习过程中的一个亮点。STL提供了许多现成的数据结构和算法,例如向量(vector)、队列(queue)、栈(stack)以及哈希表(unordered_map)等。在学习STL之前,我花了大量时间自己实现这些数据结构,而STL的出现大大简化了我的开发过程。

通过学习STL,我认识到了高效代码的重要性,也学会了如何快速解决问题。例如,在一次编程竞赛中,我需要快速实现一个排序功能,而STL中的sort函数帮助我节省了大量时间。与此同时,我还了解了STL背后的一些实现原理,例如迭代器的使用和时间复杂度的分析。

错误与调试:不可避免的成长

在学习C++的过程中,错误和调试是不可避免的。无论是编译错误还是运行时错误,几乎每次编写代码时都要面对各种各样的问题。这让我一开始感到沮丧,但随着经验的积累,我学会了如何分析错误信息并快速定位问题。

调试工具是我的好帮手。例如,使用gdb调试器让我能够逐行检查代码的执行过程,而现代的集成开发环境(IDE)如Visual Studio则提供了更直观的调试界面。此外,我还养成了在代码中添加日志和断点的习惯,这些技巧帮助我在处理复杂问题时更加得心应手。

提升编程效率的技巧

随着对C++的深入学习,我也总结了一些提升编程效率的技巧:

  1. 模块化编程:将代码分成多个文件,使得每个模块专注于完成特定的任务,从而提高代码的可读性和可维护性。
  2. 注重代码规范:遵循一致的命名规则和缩进风格,让代码更易于理解。
  3. 利用C++11/14/17的新特性:例如,auto关键字简化了变量类型的声明,智能指针(std::shared_ptrstd::unique_ptr)帮助更安全地管理内存。
  4. 多阅读优秀代码:通过阅读开源项目中的代码,我学到了很多实用的编程技巧和设计模式。

总结与展望

学习C++不仅让我掌握了一门编程语言,更让我养成了严谨的思维方式。在这个过程中,我学会了如何从问题中总结经验,如何不断优化自己的代码,以及如何以更高效的方式解决实际问题。

未来,我希望能够继续深入学习C++的高级特性,例如模板编程和多线程开发,同时也希望能够将C++应用于更多实际项目中,如游戏开发、嵌入式系统和高性能计算。我相信,通过不断的实践和学习,我将在C++的世界中发现更多的乐趣和可能性。

总之,C++是一门值得花时间深入学习的语言。尽管它的学习曲线较陡,但正是这种挑战让我更加热爱编程,也让我在每次克服困难后获得了巨大的成就感。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497993.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Windows无法同时使用有线网和无线网WIFI的问题

参考资料 电脑无线网wifi和有线网同时使用&#xff08;内网外网同时使用&#xff09;用route命令解决Wifi和网卡不能同时上内外网问题 解决方法 对于Windows系统同时连接有线网和无线网Wifi时&#xff0c;只会有一个网关生效&#xff0c;因此我们需要手动通过route命令设置网…

2025常见的软件测试面试题

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 “ 今天我给大家介绍一些python自动化测试中常见的面试题&#xff0c;涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容&#xff0c;希望能够帮助…

uni.getLocation+百度地图,报错getLocation:fail translate coordinate system faild

问题描述&#xff1a; 经测验&#xff0c;在type传入gcj02时才会报错&#xff0c;要使用gcj02就要配置地图key&#xff0c;没配置&#xff0c;uni.getLocation就会忽略type参数。 当key配置的是百度地图时type传入gcj02会报错。 还有就是不能在谷歌浏览器使用&#xff0c;不然调…

SickOs1.1

下载安装 名称&#xff1a;SickOs&#xff1a;1.1 发布日期&#xff1a;2015 年 12 月 11 日作者: D4rk系列&#xff1a;SickOs sick0s1.1.7z&#xff08;大小&#xff1a;623 MB&#xff09;下载&#xff08;镜像&#xff09;&#xff1a; https: //download.vulnhub.com/sick…

基于卷积神经网络的甲状腺结节识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示&#xff1a; 甲状腺结节识别系统&#xff0c;卷积神经网络&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 …

自动化文档处理:Azure AI Document Intelligence

Azure AI Document Intelligence支持多种文件格式&#xff0c;包括PDF、JPEG、PNG等。其核心功能是将这些文档按页进行内容提取&#xff0c;并转化为LangChain文档。其默认输出格式是Markdown&#xff0c;这使得文档可以通过MarkdownHeaderTextSplitter进行语义分片。您也可以使…

在 Ubuntu 24.04.1 LTS | Python 3.12 环境下部署 Crypto 库

测试一些密码学方案需要用到 Crypto 库&#xff0c;网上教程大多针对 Windows 和 Python 3.10 或以下的环境&#xff0c;所以写下了这篇博文。 部署与使用 首先执行 su 输入密码进入超级用户&#xff0c;部署完 Python 3.12 环境后&#xff0c;执行以下命令进行安装&#xff…

初学stm32 --- FSMC驱动LCD屏

目录 FSMC简介 FSMC框图介绍 FSMC通信引脚介绍 FSMC_NWE 的作用 FSMC_NWE 的时序关系 FSMC_NOE 的含义 FSMC_NOE 的典型用途 FSMC_NOE 的时序关系 使用FSMC驱动LCD FSMC时序介绍 时序特性中的 OE ILI9341重点时序&#xff1a; FSMC地址映射 HADDR与FSMC_A关系 LCD的…

Oracle 数据库 dmp文件从高版本导入低版本的问题处理

当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份&#xff0c;然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题&#xff0c;在使用exp命令导出的时候使用的客…

VScode怎么重启

原文链接&#xff1a;【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行&#xff0c;如下图&#xff1a; 输入Reload Window&#xff0c;如下图&#xff1a;

NLP自然语言处理——使用飞桨实现基于LSTM的情感分析

任务说明&#xff1a; 通过对电影评论历史数据分析&#xff0c;构建深度学习分类模型&#xff0c;最终完成对新的数据样本的识别分类。 任务要求&#xff1a; 运用神经网络算法&#xff0c;创建、训练、评估模型&#xff0c;完成对电影评论的情感分类任务。 数据集说明&#xf…

百度热力图数据处理流程Arcgis PRO篇,Arcgis,QGIS见链接其他文章

目录 0、Arcgis&#xff0c;Arcgis Pro&#xff0c;QGis软件选择1、Arcgis&#xff0c;QGIS软件数据处理教程&#xff08;最近太忙后续更新&#xff09;1.1、Arcgis篇操作1.2、QGIS篇操作 2、Arcgis PRO 百度热力图数据处理流程&#xff01;&#xff01;&#xff01;&#xff0…

从底层源码剖析AQS的来龙去脉!

文章目录 一、AQS概述二、AQS底层结构2.1 AQS底层基本变量2.2 Node节点结构2.3 FIFO队列 三、源码分析3.1 lock3.1.1 lock3.1.2 acquire3.1.2.1 tryAcquire3.1.2.2 addWaiter3.1.2.3 acquireQueued3.1.2.4 selfInterrupt 3.2 unlock 四、写在最后 一、AQS概述 谈到并发&#x…

运动健康小程序SpringBoot+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

【Linux网络编程】第十七弹---深入理解以太网与ARP协议:从帧格式到数据报解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、认识以太网 1.1、以太网帧格式 1.2、认识 MAC 地址 1.3、对比理解 MAC 地址和 IP 地址 1.4、认识 MT…

Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成logback 及 原理分析

文章目录 Pre官网集成步骤POM依赖使用第一步&#xff1a;编写 Logback 的配置文件第二步&#xff1a;在代码中使用 SLF4J 原理分析1. 获取对应的 ILoggerFactory2. 根据 ILoggerFactory 获取 Logger 实例3. 日志记录过程 小结 Pre Java - 日志体系_Apache Commons Logging&…

引发C++程序内存泄漏的原因分析与排查方法总结

目录 1、概述 2、内存泄漏与程序的位数 3、调用哪些接口去动态申请内存&#xff1f; 4、引发内存泄漏的常见原因总结 4.1、通过malloc/new等动态申请的内存&#xff0c;在使用完后&#xff0c;没有调用free/delete去释放&#xff08;也可能是调用了上面讲到的HeapAlloc或V…

仓颉编程语言:编程世界的 “文化瑰宝”

我的个人主页 在当今编程领域百花齐放的时代&#xff0c;各种编程语言争奇斗艳&#xff0c;服务于不同的应用场景和开发者群体。然而&#xff0c;有这样一种编程语言&#xff0c;它承载着独特的文化内涵&#xff0c;宛如编程世界里一颗熠熠生辉的“文化瑰宝”&#xff0c;那就…

【Java】Spring Bean生命周期讲解

Spring bean生命周期的重要性 了解bean生命周期有助于更好掌握Spring框架&#xff0c;理解其对bean实例的管理和创建方式。有助于解决bean相关问题&#xff0c;如循环依赖问题&#xff0c;利于编写健壮、灵活、易维护的应用程序。 bean definition概念 spring容器实例化时&…

物联网工厂可视化监控平台:为智能制造打造的可视化大屏

01行业背景 随着技术的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;已经成为推动数字化转型的核心力量。物联网通过连接各种设备和传感器&#xff0c;实现数据的实时收集、传输和分析&#xff0c;为各行各业带来了革命性的变化。随着5G、云计算、大数据等技术的成熟…