返回 课程

信奥AC之路-1级

0% 完成
0/0 步骤
  1. 第1课 开发环境与基础输出
    5 主题|小节
  2. 第2课 算术运算符
    7 主题|小节
  3. 第3课 printf与运算输出
    7 主题|小节
  4. 第4课 数的进制与拆位
    6 主题|小节
  5. 第5课 变量与基础运算
    17 主题|小节
  6. 第6课 常量与取整运算
    8 主题|小节
  7. 第7课 关系运算
    8 主题|小节
  8. 第8课 逻辑运算
    9 主题|小节
  9. 第9课 输入与计算进阶
    10 主题|小节
  10. 第10课 if语句及双分支语句
    8 主题|小节
  11. 第11课 if语句及双分支进阶
    11 主题|小节
  12. 第12课 三目运算
    9 主题|小节
  13. 第13课 多分支、多if和switch语句
    11 主题|小节
  14. 第14课 循环(基本输出)
    7 主题|小节
  15. 第15课 循环(While+If)
    8 主题|小节
  16. 第16课 循环(计数、求和、求乘积)
    7 主题|小节
  17. 第17课 循环进阶(While+)
  18. 第18课 do-while及while其他用法
  19. 第19课 For循环基础
  20. 第20课 For循环进阶
课 11, 主题|小节 2
进行中

11.1 几何问题中的条件判断

2025年12月1日
课 进展
0% 完成

11.1.1 矩形扩建为正方形

“在几何问题中,条件判断经常被用来处理不同的形状和尺寸之间的转换,”我解释道,”让我们从一个关于矩形鱼塘扩建的问题开始。”

实验一:扩建鱼塘问题

题目描述:有一个尺寸为m×n的矩形鱼塘,请问如果要把该鱼塘扩建为正方形,那么它的面积至少增加了多少平方米?

样例输入

3 5

样例输出

16

思路分析: 要将矩形扩建为正方形,需要确定正方形的边长。为了使扩建面积最小,应选择矩形的较长边作为正方形的边长。在样例中,较长边是5,所以正方形面积为5×5=25,原矩形面积为3×5=15,增加的面积为25-15=10平方米。

代码实现

// 方法一:使用变量k存储结果
#include <iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    int k;
    k = m * m - m * n;    // 假设m较大,计算扩建面积
    if(m < n) {           // 如果假设错误(n更大)
        k = n * n - m * n; // 重新计算扩建面积
    }
    cout << k;
    return 0;
}

// 方法二:使用变量d存储较大值
#include <iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    int d = m;            // 假设m较大
    if(n > m) {           // 如果n更大
        d = n;            // 更新d为较大值
    }
    cout << d * d - m * n; // 计算扩建面积
    return 0;
}

// 方法三:使用swap函数
#include <iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    if(m < n) {           // 如果m小于n
        swap(m, n);       // 交换m和n,确保m为较大值
    }
    cout << m * m - m * n; // 计算扩建面积
    return 0;
}

// 方法四:提前返回
#include <iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    if(m > n) {           // 如果m大于n
        cout << m * m - m * n; // 输出结果
        return 0;         // 结束程序
    }
    cout << n * n - m * n; // 如果m不大于n,输出另一结果
    return 0;
}

// 方法五:使用两个独立的if语句
#include <iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    if(m > n) {           // 如果m大于n
        cout << m * m - m * n; // 输出结果1
    }
    if(m <= n) {          // 如果m小于等于n
        cout << n * n - m * n; // 输出结果2
    }
    return 0;
}

// 方法六:使用if-else语句
#include <iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    if(m < n) {           // 如果m小于n
        cout << n * n - m * n; // 输出结果1
    } else {              // 否则(m大于等于n)
        cout << m * m - m * n; // 输出结果2
    }
    return 0;
}

// 方法七:使用max函数
#include <iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    int d = max(m, n);    // 使用max函数找出较大值
    cout << d * d - m * n; // 计算扩建面积
    return 0;
}

思考

  1. 方法一先假设m较大,如果假设错误则重新计算
  2. 方法二使用变量d存储较大值,避免重复计算
  3. 方法三使用swap函数确保m为较大值,简化后续计算
  4. 方法四使用提前返回,避免额外变量
  5. 方法五使用两个独立的if语句处理两种情况
  6. 方法六使用if-else结构,确保只有一个分支被执行
  7. 方法七使用max函数直接获取较大值,代码最简洁

11.1.2 判断三角形

“在几何问题中,判断三角形是否存在是一个经典问题,”我继续说道,”它需要我们应用三角形的基本性质进行条件判断。”

实验二:是否构成三角形

题目描述:输入三个整数,表示3条线段的长度,判断这三条线段能否构成三角形。能构成就输出Yes,否则输出No。三角形的判断标准是:任意两边之和要大于第三边。

样例输入

3 4 5

样例输出

Yes

样例输入

1 2 3

样例输出

No

思路分析: 根据三角形的性质,任意两边之和必须大于第三边。因此,需要判断三组边的组合是否都满足这个条件。在第一个样例中,3+4>5、3+5>4和4+5>3都成立,所以可以构成三角形。在第二个样例中,1+2=3不大于3,所以不能构成三角形。

代码实现

// 方法一:使用字符串变量存储结果
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    string st = "No";                  // 默认结果为No
    if(a + b > c && a + c > b && b + c > a) {
        st = "Yes";                    // 如果满足条件,更新结果为Yes
    }
    cout << st;
    return 0;
}

// 方法二:逻辑取反的应用
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    string st = "Yes";                 // 默认结果为Yes
    if(!(a + b > c && a + c > b && b + c > a)) {
        st = "No";                     // 如果不满足条件,更新结果为No
    }
    cout << st;
    return 0;
}

// 方法三:德摩根定律应用
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    string st = "No";                  // 默认结果为No
    if(!(a + b <= c || a + c <= b || b + c <= a)) {
        st = "Yes";                    // 如果满足条件,更新结果为Yes
    }
    cout << st;
    return 0;
}

// 方法四:直接使用或运算
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    string st = "Yes";                 // 默认结果为Yes
    if(a + b <= c || a + c <= b || b + c <= a) {
        st = "No";                     // 如果不满足条件,更新结果为No
    }
    cout << st;
    return 0;
}

// 方法五:使用两个独立的if语句
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    if(a + b > c && a + c > b && b + c > a) {
        cout << "Yes";                 // 如果满足条件,输出Yes
    }
    if(a + b <= c || a + c <= b || b + c <= a) {
        cout << "No";                  // 如果不满足条件,输出No
    }
    return 0;
}

// 方法六:使用if-else语句和与运算
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    if(a + b > c && a + c > b && b + c > a) { // !(a+b<=c||a+c<=b||b+c<=a)
        cout << "Yes";                 // 满足条件,输出Yes
    } else {                           // 否则(不满足条件)
        cout << "No";                  // 输出No
    }
    return 0;
}

// 方法七:使用if-else语句和或运算
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    if(a + b <= c || a + c <= b || b + c <= a) { //!(a+b>c&&a+c>b&&b+c>a)
        cout << "No";                  // 不满足条件,输出No
    } else {                           // 否则(满足条件)
        cout << "Yes";                 // 输出Yes
    }
    return 0;
}

思考

  1. 方法一和方法二分别从正面和反面判断三角形条件
  2. 方法三和方法四应用了德摩根定律,将”与”条件转换为”或”条件
  3. 方法五使用两个独立的if语句分别处理两种情况
  4. 方法六使用if-else结构和”与”运算判断三角形条件
  5. 方法七使用if-else结构和”或”运算判断三角形不成立条件
  6. 所有方法都基于三角形的基本性质:任意两边之和大于第三边