
博客主页:[小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 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《数字性质》的分析与优化,我们逐步从基础的逐条逻辑判断 演进到使用变量提取 与结构优化 的方法。这不仅提高了代码的效率 ,还增强了程序的可维护性 与扩展性 。同时,优化过程展示了编程中从局部优化到全局抽象的思维路径。希望本文的探讨能够为读者提供启发,在未来的编程实践中实现更高效的逻辑处理 与代码优化 。
程序优化 的意义不仅在于代码本身的改进,更在于启迪思考:如何通过结构化的分析 和抽象 找到最佳解决方案。这种能力是编程的核心,也是构建复杂软件系统的基础。






