【C++】数的性质问题分析与优化
文章目录
- 💯前言
- 💯题目解析与分析
- 题目描述
- 题目分析
- 💯我的解法与详细解读
- 初始代码实现
- 解法分析
- 💯老师解法与其改进思路
- 老师代码实现
- 改进与优势
- 💯对比分析
- 1. 功能目标
- 2. 代码结构
- 3. 可读性
- 4. 扩展性
- 目标和建议
- 💯程序优化与对比
- 优化思路
- 优化代码实现
- 优化分析
- 💯思考拓展
- 💯小结
💯前言
- 在 C++ 编程中,数字性质判断题是一个经典主题。这类问题不仅考察逻辑判断的严谨性,还需要编写简洁高效的代码。在本次讨论中,我们以题目
P5710《数字性质》
为例,深入分析题目要求,对比初学者与教师的解法,并进一步提出优化方案与思想拓展。本篇文章将结构化地解析该问题,并通过程序设计的原则延展其应用场景。通过本文,希望读者能够系统理解这类问题的解题思路,并培养优化代码的能力。这不仅是编程能力的体现,也是思维方式与方法论的提升。
C++ 参考手册
💯题目解析与分析
题目描述
数的性质
题目地址: 洛谷OJ P5710《数字性质》
一个整数可以具有以下两种性质:
- 性质1:为偶数。
- 性质2:大于4且小于或等于12。
针对这些性质,四个人的喜好如下:
- 小A: 喜欢同时满足性质1和性质2的数字。
- 小B: 喜欢至少满足一种性质的数字。
- Uim: 喜欢满足性质1但不满足性质2的数字。
- 正妹: 喜欢满足性质2但不满足性质1的数字。
输入格式:
一个整数 x x x,满足 0 ≤ x ≤ 1000 0 \leq x \leq 1000 0≤x≤1000。
输出格式:
根据每个人的喜好,输出四个数字,以空格分隔,分别表示小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;
}
解法分析
- 逻辑分解:
- 对每个人的判断均采用单独的条件语句逐一实现。
- 代码解读:
- 小A:判断 x x x 是否同时满足性质1和性质2。
- 小B:判断 x x x 是否满足性质1或性质2。
- Uim:判断 x x x 是否满足性质1但不满足性质2。
- 正妹:判断 x x x 是否不满足性质1但满足性质2。
- 优点:
- 条件判断直接,适合入门学习。
- 不足:
- 存在重复逻辑,如性质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. 功能目标
-
我的代码:
- 判断数字是否满足以下逻辑:
- 同时满足两个条件:偶数且在区间(4,12]。
- 至少满足一个条件。
- 复杂逻辑组合:满足一种但不满足另一种。
- 不满足两个条件。
- 注重条件的交集和排斥逻辑,但复杂性更高。
- 判断数字是否满足以下逻辑:
-
老师的代码:
- 判断数字是否满足:
- 同时满足两个条件。
- 至少满足一个条件。
- 只满足一个条件。
- 完全不满足条件。
- 专注于每种逻辑情况的划分,代码更具教学性。
- 判断数字是否满足:
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和性质2分别提取为布尔变量,避免了重复计算。
- 代码简洁:
- 通过布尔表达式直接输出结果,无需多层条件语句。
- 扩展性强:
- 如需增加新性质或新逻辑,只需增设布尔变量,无需大幅修改代码结构。
优化后的代码显著提升了简洁性和可维护性。布尔变量的引入不仅减少了冗余,还增强了代码的直观性。
💯思考拓展
- 函数封装:
- 将每个人的判断逻辑封装成独立函数,进一步提升代码复用性与模块化程度。例如,可以通过定义一个通用的判断函数,使得不同条件逻辑以参数形式传递。
- 数据结构引入:
- 可使用结构体存储不同性质与判断逻辑,通过统一的接口函数实现动态判断。这种方法尤其适合条件数量多且复杂的场景。
- 更多条件扩展:
- 通过模板函数或策略模式,构建更通用的条件判断框架,使得代码可以轻松适应未来扩展的需求。
💯小结
通过对题目P5710《数字性质》
的分析与优化,我们逐步从基础的逐条逻辑判断演进到使用变量提取与结构优化的方法。这不仅提高了代码的效率,还增强了程序的可维护性与扩展性。同时,优化过程展示了编程中从局部优化到全局抽象的思维路径。希望本文的探讨能够为读者提供启发,在未来的编程实践中实现更高效的逻辑处理与代码优化。
程序优化的意义不仅在于代码本身的改进,更在于启迪思考:如何通过结构化的分析和抽象找到最佳解决方案。这种能力是编程的核心,也是构建复杂软件系统的基础。
相关文章:

【C++】数的性质问题分析与优化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目解析与分析题目描述题目分析 💯我的解法与详细解读初始代码实现解法分析 💯老师解法与其改进思路老师代码实现改进与优势 💯对比分析…...
ASP.NET Core WebAPI中使用Jwt实现鉴权授权-System.IdentityModel.Tokens.Jwt
使用 System.IdentityModel.Tokens.Jwt 直接实现基于 JWT 的鉴权和授权,可以在 ASP.NET Core 中手动生成、解析、验证 JWT Token。System.IdentityModel.Tokens.Jwt 提供了 JWT 的生成和解析的 API。以下是如何使用该库实现鉴权授权的详细步骤。 步骤 1: 安装 NuGe…...

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)
目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则: 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…...

嵌入式软考学习笔记(1)超详细!!!
目录 第一章计算机系统基础知识 1、逻辑运算 2、数的表示 3、总线系统 5、流水线 6、存储器 7、可靠性、校验码 第一章计算机系统基础知识 1、逻辑运算 与:有0则0,全1才1 或:有1则1,全0才0 异或:相同为0…...

【数据分享】2013-2023年我国省市县三级的逐年CO数据(免费获取\excel\shp格式)
空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2023年的省市县三级的逐年PM2.5数据、2000-2023年的省市县三级的逐年PM10数据、2013-2023年的省市县三级的逐年SO2数据、2000-2023年省市县三级的逐年O3数据和2008-2023年我国省市县三级的逐…...

C# 探险之旅:第十六节 - 整数类型:与八位数字精灵的奇幻舞会
嘿,勇敢的探险家们!欢迎再次踏上C#编程的奇幻之旅。今天,我们将进入一个充满魔法与数字的世界——整数类型的王国。想象一下,你站在一个华丽的舞池中,周围是八位身着华丽舞裙(其实是二进制位啦)…...
Cleo文件传输软件存在任意文件读取漏洞(CVE-2024-50623)
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
Java 小抄|解析 JSON 并提取特定层级数据
文章目录 前言环境准备依赖库 示例代码JSON 数据Java 类定义解析 JSON 数据代码解释 结论 前言 在日常开发中,我们经常需要从 JSON 数据中提取特定的信息。本文将介绍如何使用 Java 和 Gson 库解析 JSON 数据,并通过流式处理提取特定层级的数据。我们将…...

活动报名:Voice Agent 开发者分享会丨RTE Meetup
引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面,一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期!12 月 15 日(周日)上午&…...

DOA估计算法——ESPRIT算法
1 简介 ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)最早是由Roy等人于1986年提出,是一种广泛应用于高分辨率方向到达(DOA)估计和频率估计的子空间方法。其核心思想基于信号子空间的…...

CEF 数据加密与网络安全
随着网络攻击的日益猖獗,确保应用的安全性已经成为开发者的首要任务。特别是在现代Web应用中,如何确保数据的加密存储、网络通信的安全性以及有效的认证机制成为至关重要的问题。对于基于 Chromium Embedded Framework (CEF) 的应用,开发者必…...
go build command
文章目录 1.简介2.格式3.选项4.示例5.小结参考文献 1.简介 go build 是 Go 语言工具链中的一个命令,它用于编译 Go 源代码并生成可执行文件。 2.格式 go build [-o output] [build flags] [packages]可选的 -o 选项强制 build 将生成的可执行文件或对象写入指定的…...
理解音频采样率和transformer模型:给Python小白的简单解释
理解音频采样率和transformer模型:给Python小白的简单解释 引言什么是采样率?举个例子有趣的现象Python小实验总结 引言 大家好!今天我们来聊一个有趣的话题:音频采样率和AI模型。不要被这些专业术语吓到,我会用最简单…...
【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...
大模型qiming面试内容整理-系统设计与架构
在大模型和机器学习相关岗位的面试中,系统设计与架构的考察通常会涉及如何设计一个可扩展、可靠且高效的机器学习系统,特别是在面对大规模数据和复杂模型时。这一部分的考察不仅测试候选人对机器学习和深度学习的理解,还会评估其如何设计实际生产环境中的系统来满足需求。以…...

Mac/Windows端长期破解myBase8方法(无需安装火绒)
提醒 不管哪个端,都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100,即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.,显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件,删除Fir…...
firewall
firewall 如果系统使用 firewalld 作为防火墙管理工具,可以使用以下命令: 查看防火墙是否运行: systemctl status firewalld查看防火墙的状态(简洁输出): firewall-cmd --state输出示例: r…...
XSS(跨站攻击)
XSS漏洞(跨站脚本) 1.XSS 漏洞简介 XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从…...
Tomcat添加各种响应头 X-Download-Options、Permissions-Policy等
AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 最近部署的项目被绿盟扫出来很多web漏洞,其中tomcat响应占了很大一部分。下面我们整理一下如何处理。 首先说说常见…...

搭建Tomcat(一)---SocketServerSocket
目录 引入1 引入2--socket 流程 Socket(应用程序之间的通讯保障) 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1:ServerSocket和Socket有什么关系? ServerSocket Soc…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...