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



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


文章目录



💯前言

  • 在 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 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;
}

解法分析

  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的判断被多次计算。
    • 可读性与扩展性较差,稍显冗余。

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


💯老师解法与其改进思路


老师代码实现

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

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


💯对比分析


1. 功能目标

  • 我的代码:

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

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

2. 代码结构

  • 我的代码:

    • 使用了多个if-else语句,每个条件的判断逻辑较为独立。

    • 第三部分逻辑较复杂,使用了嵌套的布尔运算:

      cpp 复制代码
      if ((x % 2 == 0 && !(x > 4 && x <= 12)) || (!(x % 2 == 0) && x > 4 && x <= 12))
      • 条件较难阅读,不够直观。
  • 老师的代码:

    • 条件划分更清晰,通过明确逻辑关系分离每个部分:

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

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


💯思考拓展

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

💯小结


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


相关推荐
talentestors5 天前
Codeforces Round 992 (Div. 2) 解题报告
c++·c·题解·cpp
caz288 天前
C支持,而C++不支持的。
c++·c·坐标·数组初始化·非平凡的指定初始化器
我代码抄都抄不明白8 天前
WINDOWS 单链表SLIST_ENTRY使用
windows·c
学习前端的小z8 天前
【C++】深入理解 if-else 语句
c
学习前端的小z9 天前
【C++】cin 和 cout :标准输入输出流的深入解析
c
itas10910 天前
C++中protobuf Message与JSON的互相转换
json·c·protobuf·pb2json·json2pb·pb转换json
Hello.Reader10 天前
利用 Redis 与 Lua 脚本解决秒杀系统中的高并发与库存超卖问题
lua·c
XLYcmy11 天前
分布式实验一
linux·c++·分布式·网络安全·操作系统·c·socket
佑冰11 天前
【洛谷】P5736 【深基7.例2】质数筛(详细思路分析)
数据结构·c++·算法·c·函数