博客主页:[小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C++
文章目录
- 💯前言
- 💯题目解析与分析
- 💯我的解法与详细解读
- 💯老师解法与其改进思路
- 💯对比分析
-
- [1. 功能目标](#1. 功能目标)
- [2. 代码结构](#2. 代码结构)
- [3. 可读性](#3. 可读性)
- [4. 扩展性](#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 是否符合不同的逻辑条件。
- 重点难点: 条件的表达方式是否清晰,代码逻辑是否冗余,是否可以进一步优化。
通过以上条件的梳理,可以看到,如何将多个逻辑条件高效且简洁地表达是解题的关键。这不仅是对编程基础的检验,也锻炼了对代码结构优化的能力。需要注意的是,判断条件的顺序和冗余度也可能影响程序的可维护性和执行效率。
💯我的解法与详细解读
初始代码实现
cpp
#include <iostream>
using namespace std;
int main()
{
int x;
cin >> x;
if(x % 2 == 0 && (x > 4 && x <= 12))
cout << 1 << " ";
else
cout << 0 << " ";
if(x % 2 == 0 || (x > 4 && x <= 12))
cout << 1 << " ";
else
cout << 0 << " ";
if((x % 2 == 0 && !(x > 4 && x <= 12)) || (!(x % 2 == 0) && x > 4 && x <= 12))
cout << 1 << " ";
else
cout << 0 << " ";
if(x % 2 != 0 && !(x > 4 && x <= 12))
cout << 1 << " ";
else
cout << 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的判断被多次计算。
- 可读性与扩展性较差,稍显冗余。
虽然此解法清晰地完成了任务,但其冗余的代码结构表明有进一步优化的空间。特别是在逻辑表达上,可以通过提取公共条件或者使用布尔变量的方式简化代码。
💯老师解法与其改进思路
老师代码实现
cpp
#include <iostream>
using namespace std;
int main() {
int x = 0;
cin >> x;
// 同时满足的情况
if (x % 2 == 0 && (x > 4 && x <= 12))
cout << 1;
else
cout << 0;
// 至少满足一种情况
if (x % 2 == 0 || (x > 4 && x <= 12))
cout << " " << 1;
else
cout << " " << 0;
// 只满足一种情况
if ((x % 2 == 0) + (x > 4 && x <= 12) == 1)
cout << " " << 1;
else
cout << " " << 0;
// 一种情况都不满足
if ((x % 2 == 0) + (x > 4 && x <= 12) == 0)
cout << " " << 1;
else
cout << " " << 0;
return 0;
}
改进与优势
- 逻辑清晰:
- 每个条件独立,逻辑分层明确,便于初学者理解。
- 局部优化:
- 减少了部分冗余的代码结构,输出部分更加紧凑。
- 不足:
- 仍然存在对性质的重复计算,未充分利用变量。
- 可扩展性不足,如需增加更多条件判断,代码修改成本较高。
老师的解法相较于初学者的版本更加紧凑,但仍未完全解决代码的冗余问题,特别是在重复计算上。逻辑的进一步抽象和优化仍有空间。
💯对比分析
1. 功能目标
-
我的代码:
- 判断数字是否满足以下逻辑:
- 同时满足两个条件:偶数且在区间(4,12]。
- 至少满足一个条件。
- 复杂逻辑组合:满足一种但不满足另一种。
- 不满足两个条件。
- 注重条件的交集和排斥逻辑,但复杂性更高。
- 判断数字是否满足以下逻辑:
-
老师的代码:
- 判断数字是否满足:
- 同时满足两个条件。
- 至少满足一个条件。
- 只满足一个条件。
- 完全不满足条件。
- 专注于每种逻辑情况的划分,代码更具教学性。
- 判断数字是否满足:
2. 代码结构
-
我的代码:
-
使用了多个
if-else
语句,每个条件的判断逻辑较为独立。 -
第三部分逻辑较复杂,使用了嵌套的布尔运算:
cppif ((x % 2 == 0 && !(x > 4 && x <= 12)) || (!(x % 2 == 0) && x > 4 && x <= 12))
- 条件较难阅读,不够直观。
-
-
老师的代码:
-
条件划分更清晰,通过明确逻辑关系分离每个部分:
cppif ((x % 2 == 0) + (x > 4 && x <= 12) == 1)
- 使用布尔值累加表示"只满足一种条件",逻辑更简洁。
-
3. 可读性
-
我的代码:
- 逻辑层次相对混乱,尤其是第三部分嵌套逻辑,增加了阅读难度。
- 使用了
&&
、||
等复杂条件组合,适合更高阶的编程练习者。
-
老师的代码:
- 条件清晰分段,容易理解每部分逻辑。
- 布尔值累加方式简化了"只满足一种条件"的判断逻辑。
4. 扩展性
-
我的代码:
- 添加新的条件较为困难,需要对嵌套逻辑进行调整。
- 由于逻辑较复杂,扩展可能会引入更多错误。
-
老师的代码:
- 条件独立,扩展性较好。
- 新增判断条件时,只需增加相应的
if
语句或调整累加逻辑。
目标和建议
- 如果目标是实现更复杂的逻辑练习: 我的代码适合。通过嵌套条件表达了交集与排斥的逻辑,但需要在复杂性和可读性之间取得平衡。
- 如果目标是编写清晰的代码,便于扩展和理解: 老师的代码更优。它利用布尔值累加简化了逻辑,逻辑条件彼此独立,便于扩展和修改。
如果你需要进一步优化或调整代码结构,可以结合两者的优点,提升代码的效率和可读性。
💯程序优化与对比
优化思路
优化的核心在于提取重复逻辑,利用布尔变量来存储性质判断结果,从而提升代码复用性与可读性。进一步的优化需考虑代码的扩展性,以适应更多复杂的条件判断。
优化代码实现
cpp
#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) << " "; // 小A
cout << (isEven || inRange) << " "; // 小B
cout << (isEven && !inRange) << " "; // Uim
cout << (!isEven && inRange) << endl; // 正妹
return 0;
}
优化分析
- 逻辑复用:
- 将性质1和性质2分别提取为布尔变量,避免了重复计算。
- 代码简洁:
- 通过布尔表达式直接输出结果,无需多层条件语句。
- 扩展性强:
- 如需增加新性质或新逻辑,只需增设布尔变量,无需大幅修改代码结构。
优化后的代码显著提升了简洁性和可维护性。布尔变量的引入不仅减少了冗余,还增强了代码的直观性。
💯思考拓展
- 函数封装:
- 将每个人的判断逻辑封装成独立函数,进一步提升代码复用性与模块化程度。例如,可以通过定义一个通用的判断函数,使得不同条件逻辑以参数形式传递。
- 数据结构引入:
- 可使用结构体存储不同性质与判断逻辑,通过统一的接口函数实现动态判断。这种方法尤其适合条件数量多且复杂的场景。
- 更多条件扩展:
- 通过模板函数或策略模式,构建更通用的条件判断框架,使得代码可以轻松适应未来扩展的需求。
💯小结
通过对题目P5710《数字性质》
的分析与优化,我们逐步从基础的逐条逻辑判断 演进到使用变量提取 与结构优化 的方法。这不仅提高了代码的效率 ,还增强了程序的可维护性 与扩展性 。同时,优化过程展示了编程中从局部优化到全局抽象的思维路径。希望本文的探讨能够为读者提供启发,在未来的编程实践中实现更高效的逻辑处理 与代码优化 。
程序优化 的意义不仅在于代码本身的改进,更在于启迪思考:如何通过结构化的分析 和抽象 找到最佳解决方案。这种能力是编程的核心,也是构建复杂软件系统的基础。