【C++】数的性质问题分析与优化


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目解析与分析
    • 题目描述
    • 题目分析
  • 💯我的解法与详细解读
    • 初始代码实现
    • 解法分析
  • 💯老师解法与其改进思路
    • 老师代码实现
    • 改进与优势
  • 💯对比分析
    • 1. 功能目标
    • 2. 代码结构
    • 3. 可读性
    • 4. 扩展性
    • 目标和建议
  • 💯程序优化与对比
    • 优化思路
    • 优化代码实现
    • 优化分析
  • 💯思考拓展
  • 💯小结


在这里插入图片描述


💯前言

  • 在 C++ 编程中,数字性质判断题是一个经典主题。这类问题不仅考察逻辑判断的严谨性,还需要编写简洁高效的代码。在本次讨论中,我们以题目 P5710《数字性质》 为例,深入分析题目要求,对比初学者与教师的解法,并进一步提出优化方案思想拓展。本篇文章将结构化地解析该问题,并通过程序设计的原则延展其应用场景。通过本文,希望读者能够系统理解这类问题的解题思路,并培养优化代码的能力。这不仅是编程能力的体现,也是思维方式方法论的提升。
    C++ 参考手册
    在这里插入图片描述

💯题目解析与分析


题目描述

数的性质
在这里插入图片描述

题目地址: 洛谷OJ P5710《数字性质》

一个整数可以具有以下两种性质:

  1. 性质1:为偶数。
  2. 性质2:大于4且小于或等于12。

针对这些性质,四个人的喜好如下:

  • 小A: 喜欢同时满足性质1和性质2的数字。
  • 小B: 喜欢至少满足一种性质的数字。
  • Uim: 喜欢满足性质1但不满足性质2的数字。
  • 正妹: 喜欢满足性质2但不满足性质1的数字。

输入格式:
一个整数 x x x,满足 0 ≤ x ≤ 1000 0 \leq x \leq 1000 0x1000

输出格式:
根据每个人的喜好,输出四个数字,以空格分隔,分别表示小A、小B、Uim、正妹对数字 x x x 的判断(1表示喜欢,0表示不喜欢)。

样例:

  • 输入:
    12
    
  • 输出:
    1 1 0 0
    

题目分析

  • 核心任务: 判断一个数字 x x x 是否符合不同的逻辑条件。
  • 重点难点: 条件的表达方式是否清晰,代码逻辑是否冗余,是否可以进一步优化。

通过以上条件的梳理,可以看到,如何将多个逻辑条件高效且简洁地表达是解题的关键。这不仅是对编程基础的检验,也锻炼了对代码结构优化的能力。需要注意的是,判断条件的顺序和冗余度也可能影响程序的可维护性和执行效率。


💯我的解法与详细解读


初始代码实现

#include <iostream>
using namespace std;
int main()
{int x;cin >> x;if(x % 2 == 0 && (x > 4 && x <= 12))cout << 1 << " ";elsecout << 0 << " ";if(x % 2 == 0 || (x > 4 && x <= 12))cout << 1 << " ";elsecout << 0 << " ";if((x % 2 == 0 && !(x > 4 && x <= 12)) || (!(x % 2 == 0) && x > 4 && x <= 12))cout << 1 << " ";elsecout << 0 << " ";if(x % 2 != 0 && !(x > 4 && x <= 12))cout << 1 << " ";elsecout << 0 << " ";return 0;
}

在这里插入图片描述

解法分析

  1. 逻辑分解:
    • 对每个人的判断均采用单独的条件语句逐一实现。
  2. 代码解读:
    • 小A:判断 x x x 是否同时满足性质1和性质2。
    • 小B:判断 x x x 是否满足性质1或性质2。
    • Uim:判断 x x x 是否满足性质1但不满足性质2。
    • 正妹:判断 x x x 是否不满足性质1但满足性质2。
  3. 优点:
    • 条件判断直接,适合入门学习。
  4. 不足:
    • 存在重复逻辑,如性质1和性质2的判断被多次计算。
    • 可读性与扩展性较差,稍显冗余。

虽然此解法清晰地完成了任务,但其冗余的代码结构表明有进一步优化的空间。特别是在逻辑表达上,可以通过提取公共条件或者使用布尔变量的方式简化代码。


💯老师解法与其改进思路


老师代码实现

#include <iostream>
using namespace std;int main() {int x = 0;cin >> x;// 同时满足的情况if (x % 2 == 0 && (x > 4 && x <= 12))cout << 1;elsecout << 0;// 至少满足一种情况if (x % 2 == 0 || (x > 4 && x <= 12))cout << " " << 1;elsecout << " " << 0;// 只满足一种情况if ((x % 2 == 0) + (x > 4 && x <= 12) == 1)cout << " " << 1;elsecout << " " << 0;// 一种情况都不满足if ((x % 2 == 0) + (x > 4 && x <= 12) == 0)cout << " " << 1;elsecout << " " << 0;return 0;
}

在这里插入图片描述


改进与优势

  1. 逻辑清晰:
    • 每个条件独立,逻辑分层明确,便于初学者理解。
  2. 局部优化:
    • 减少了部分冗余的代码结构,输出部分更加紧凑。
  3. 不足:
    • 仍然存在对性质的重复计算,未充分利用变量。
    • 可扩展性不足,如需增加更多条件判断,代码修改成本较高。

老师的解法相较于初学者的版本更加紧凑,但仍未完全解决代码的冗余问题,特别是在重复计算上。逻辑的进一步抽象和优化仍有空间。


💯对比分析


1. 功能目标

  • 我的代码:

    • 判断数字是否满足以下逻辑:
      1. 同时满足两个条件:偶数且在区间(4,12]。
      2. 至少满足一个条件。
      3. 复杂逻辑组合:满足一种但不满足另一种。
      4. 不满足两个条件。
    • 注重条件的交集和排斥逻辑,但复杂性更高。
  • 老师的代码:

    • 判断数字是否满足:
      1. 同时满足两个条件。
      2. 至少满足一个条件。
      3. 只满足一个条件。
      4. 完全不满足条件。
    • 专注于每种逻辑情况的划分,代码更具教学性。

2. 代码结构

  • 我的代码:

    • 使用了多个if-else语句,每个条件的判断逻辑较为独立。
    • 第三部分逻辑较复杂,使用了嵌套的布尔运算:
      if ((x % 2 == 0 && !(x > 4 && x <= 12)) || (!(x % 2 == 0) && x > 4 && x <= 12))
      
      • 条件较难阅读,不够直观。
  • 老师的代码:

    • 条件划分更清晰,通过明确逻辑关系分离每个部分:
      if ((x % 2 == 0) + (x > 4 && x <= 12) == 1)
      
      • 使用布尔值累加表示“只满足一种条件”,逻辑更简洁。

3. 可读性

  • 我的代码:

    • 逻辑层次相对混乱,尤其是第三部分嵌套逻辑,增加了阅读难度。
    • 使用了&&||等复杂条件组合,适合更高阶的编程练习者。
  • 老师的代码:

    • 条件清晰分段,容易理解每部分逻辑。
    • 布尔值累加方式简化了“只满足一种条件”的判断逻辑。

4. 扩展性

  • 我的代码:

    • 添加新的条件较为困难,需要对嵌套逻辑进行调整。
    • 由于逻辑较复杂,扩展可能会引入更多错误。
  • 老师的代码:

    • 条件独立,扩展性较好。
    • 新增判断条件时,只需增加相应的if语句或调整累加逻辑。

目标和建议

  • 如果目标是实现更复杂的逻辑练习: 我的代码适合。通过嵌套条件表达了交集与排斥的逻辑,但需要在复杂性和可读性之间取得平衡。
  • 如果目标是编写清晰的代码,便于扩展和理解: 老师的代码更优。它利用布尔值累加简化了逻辑,逻辑条件彼此独立,便于扩展和修改。

如果你需要进一步优化或调整代码结构,可以结合两者的优点,提升代码的效率和可读性。


💯程序优化与对比


优化思路

优化的核心在于提取重复逻辑,利用布尔变量来存储性质判断结果,从而提升代码复用性与可读性。进一步的优化需考虑代码的扩展性,以适应更多复杂的条件判断。


优化代码实现

#include <iostream>
using namespace std;int main() {int x;cin >> x;// 定义布尔变量表示性质bool isEven = (x % 2 == 0);           // 性质1:偶数bool inRange = (x > 4 && x <= 12);    // 性质2:范围判断// 逐一输出结果cout << (isEven && inRange) << " ";   // 小Acout << (isEven || inRange) << " ";   // 小Bcout << (isEven && !inRange) << " ";  // Uimcout << (!isEven && inRange) << endl; // 正妹return 0;
}

在这里插入图片描述


优化分析

  1. 逻辑复用:
    • 将性质1和性质2分别提取为布尔变量,避免了重复计算。
  2. 代码简洁:
    • 通过布尔表达式直接输出结果,无需多层条件语句。
  3. 扩展性强:
    • 如需增加新性质或新逻辑,只需增设布尔变量,无需大幅修改代码结构。

优化后的代码显著提升了简洁性和可维护性。布尔变量的引入不仅减少了冗余,还增强了代码的直观性。


💯思考拓展

  1. 函数封装:
    • 将每个人的判断逻辑封装成独立函数,进一步提升代码复用性与模块化程度。例如,可以通过定义一个通用的判断函数,使得不同条件逻辑以参数形式传递。
  2. 数据结构引入:
    • 可使用结构体存储不同性质与判断逻辑,通过统一的接口函数实现动态判断。这种方法尤其适合条件数量多且复杂的场景。
  3. 更多条件扩展:
    • 通过模板函数或策略模式,构建更通用的条件判断框架,使得代码可以轻松适应未来扩展的需求。

💯小结

  • 在这里插入图片描述
    通过对题目 P5710《数字性质》 的分析与优化,我们逐步从基础的逐条逻辑判断演进到使用变量提取结构优化的方法。这不仅提高了代码的效率,还增强了程序的可维护性扩展性。同时,优化过程展示了编程中从局部优化全局抽象的思维路径。希望本文的探讨能够为读者提供启发,在未来的编程实践中实现更高效的逻辑处理代码优化
    程序优化的意义不仅在于代码本身的改进,更在于启迪思考:如何通过结构化的分析抽象找到最佳解决方案。这种能力是编程的核心,也是构建复杂软件系统的基础。

在这里插入图片描述


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

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

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

相关文章

让文案生成更具灵活性/chatGPT新功能canvas画布编辑

​ ​ OpenAI最近在2024年12月发布了canvas画布编辑功能&#xff0c;这是一项用途广泛的创新工具&#xff0c;专为需要高效创作文案的用户设计。 无论是职场人士、学生还是创作者&#xff0c;这项功能都能帮助快速生成、优化和编辑文案&#xff0c;提升效率的同时提高内容质量…

分布式事物XA、BASE、TCC、SAGA、AT

分布式事务——Seata 一、Seata的架构&#xff1a; 1、什么是Seata&#xff1a; 它是一款分布式事务解决方案。官网查看&#xff1a;Seata 2.执行过程 在分布式事务中&#xff0c;会有一个入口方法去调用各个微服务&#xff0c;每一个微服务都有一个分支事务&#xff0c;因…

深度学习——激活函数、损失函数、优化器

深度学习——激活函数、损失函数、优化器 1、激活函数1.1、一些常见的激活函数1.1.1、sigmoid1.1.2、softmax1.1.3、tanh1.1.4、ReLU1.1.5、Leaky ReLU1.1.6、PReLU1.1.7、GeLU1.1.8、ELU 1.2、激活函数的特点1.2.1、非线性1.2.2、几乎处处可微1.2.3、计算简单1.2.4、非饱和性1…

opencv-python的简单练习

1、读取一张彩色图像并将其转换为灰度图。 import cv2 img cv2.imread("../1iamge/a.jpg") # 灰度化 img_gray cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY) cv2.imshow(img, img) cv2.imshow(img_gray, img_gray) cv2.waitKey(0) 2、编写程序&#xff0c;读取一张彩色…

Java、鸿蒙与嵌入式开发:技术选择与职业发展分析

在当今快速发展的科技领域中&#xff0c;Java、鸿蒙和嵌入式开发代表着不同的技术方向和职业机遇。每个方向都有其独特的市场价值和发展前景&#xff0c;让我们深入分析这三个领域的特点、发展趋势和职业规划。 Java开发方向已经发展了二十多年&#xff0c;仍然在软件开发领域…

【mybatis】缓存

目录 1. mybatis的运行 1.1 引言 1.2 具体运行&#xff1a; 1.3 sqlSession 介绍local catch 2. 缓存 2.1 概念 2.2 使用缓存的原因 2.3 什么样的数据能使用缓存 3. Mybatis缓存 3.1 一级缓存 3.1.1 测试一级缓存 3.1.2 缓存失效的四种情况 $1 sqlSession不同 $…

前端成长之路:CSS元素显示模式

元素显示模式 网页中的标签非常的多&#xff0c;在不同的地方会使用到不同类型的标签&#xff0c;了解这些标签的特点可以更好的布局我们的网页。 元素显示模式就是元素&#xff08;标签&#xff09;按照什么方式进行显示&#xff0c;比如&#xff1a;div标签会自己独占一行&a…

Unity类银河战士恶魔城学习总结(P178 Archer s arrow 弓箭手的箭)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节制作了一个弓箭手的箭 Arrow_Controller.cs 1.OnTriggerEnter2D方法 功能&#xff1a;检测箭矢与其他对象的碰撞。逻辑&#xff1…

机器学习周报(12.9-12.15)

文章目录 摘要Abstract 1 Swin Transformer1.1 输入1.2 Patch Partition1.3 Linear Embedding1.4 Patch Merging1.5 Swin Transformer Block1.6 代码总结 摘要 本篇博客介绍了采用类似于卷积核的移动窗口进行图像特征提取的Swin Transformer网络模型&#xff0c;这是一种基于T…

【C++游记】Vector的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

Jenkins流水线初体验(六)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装(三) Harbor镜像仓库介绍&安装 (四) Jenkins容器使用宿主机Docker(五) Jenkins流水线初体验(六) 一、Jenkins流水线任务介绍 之前采用Jenkins的自由风格构建的项目,每个步骤…

Android后端签到flask迁移到rust的axum的过程-签到性能和便携

本次变更了以下内容: 为了使用之前ip2sta的ip到端点名的python,dic变量,将其存入redis hashset.使用地址/api/ip2dic 手动执行之.并且定义在/station/init,这个每天初始化redis的路径下.在rust axum使用redis 连接池在test中 ip2dic,IP转端点名,转本日此端网址.在前端的人名下…

Python OCR文字识别api接口

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

.NET 6.0 中接入 Log4net 和 NLog

一、接入Log4net 1.按日期和大小混合分割日志 nuget包安装 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 配置文件 配置文件内容为 <?xml version"1.0" encoding"utf-8"?> <log4net> <!-- Define some output appe…

编写php项目所需环境

需要编写php项目&#xff0c;需要看到编写的代码展现的效果&#xff0c;这里我选择用xampp来展现 准备工作&#xff1a; https://learncodingfast.com/how-to-install-xampp-and-brackets/#Installing_and_Running_XAMPP xampp下载地址&#xff1a;https://www.apachefriends.…

树莓派Pico火灾报警器项目:基于火焰传感器、蜂鸣器与LED的C++实现

火灾是我们生活中一个不可忽视的安全隐患,而火灾报警系统在预防火灾和保障人员安全方面起着至关重要的作用。通过嵌入式技术,我们可以实现一个简单而有效的火灾报警装置。在本项目中,我们将利用 树莓派Pico 控制 火焰传感器、LED 和 蜂鸣器,模拟火灾报警装置的工作原理。本…

数学建模问题中的多目标规划

多目标规划&#xff08;Multi-Objective Optimization, MOO&#xff09;是指在优化问题中同时优化多个相互冲突的目标函数的情况。与单目标优化问题不同&#xff0c;多目标优化的解通常不再是唯一的&#xff0c;而是一个解的集合&#xff0c;称为帕累托最优解集。这些解在所有目…

智汇云舟4个案例入选“中国联通智慧城市物联感知与AI应用案例”

12月10日&#xff0c;由中国联通智慧城市军团联合联通数字科技有限公司物联网事业部、物联中国团体组织联席会共同主办的“中国联通首届智慧城市领域物联感知与AI应用优秀案例发布交流大会”在郑州举行。大会现场对50余个优秀案例进行了集中发布与表彰。智汇云舟凭借深厚的技术…

【JavaEE】网络(1)

&#x1f435;本篇文章开始讲解计算机网络相关的知识 一、基础概念 1.1 局域网和广域网 局域网→Local Area Network→简称LAN&#xff0c;局域网是局部组建的一种私有网络&#xff0c;局域网内的主机之间可以进行网络通信&#xff0c;局域网和局域网之间在没有连接的情况不能…

Unity 模板测试透视效果(URP)

可以实现笼中窥梦和PicoVR中通过VST局部透视效果。 使用到的Shader: Shader "Unlit/StencilShader" {Properties{[IntRange]_Index("Stencil Index",Range(0,255))0}SubShader{Tags{"RenderType""Opaque""Queue""Geo…