文章

【GESP】C++八级考试大纲知识点梳理 (5) 代数与平面几何

继上一篇我们探讨了倍增法之后,我们继续深入 GESP C++ 八级大纲。今天我们来聊聊编程中必不可少的数学基础——代数与平面几何

(5)掌握代数与平面几何基础知识(初中数学部分)。包括方程的概念及一元一次方程、二元一次方程的基本求解技巧,求基础平面几何概念、求基本图形(如长方形、三角形、圆形等)的面积等

虽然 GESP 是编程考试,但数学是算法的基石。在八级考试中,代数和几何通常不会像数学卷子那样考证明题,而是考查利用计算机计算公式的能力以及将几何/代数问题转化为代码逻辑的能力

本人也是边学、边实验、边总结,且对考纲深度和广度的把握属于个人理解。因此本文更多的不是一个教程,而是个人知识梳理,如有遗漏、疏忽,欢迎指正、交流。

一、代数基础:方程与求解

在计算机科学中,解方程通常是“模拟”或者“公式化”的过程。

1.1 方程的概念

方程是含有未知数的等式。 在 C++ 中,我们并不是像手算一样去“移项、合并同类项”,而是需要推导出一个通用的计算公式,然后让计算机套用公式算出结果。

1.2 一元一次方程 (Linear Equation in One Variable)

标准形式:$ax + b = 0$ (其中 $x$ 是未知数,$a \neq 0$)

数学求解: 移项得 $ax = -b$,系数化为 1 得 $x = -\frac{b}{a}$。

编程实现思路: 如果题目给出 $a$ 和 $b$,我们只需要一行代码:

1
double x = -b / a;

注意:在编程中要特别注意 $a=0$ 的情况(除数为 0 异常)。如果 $a=0$ 且 $b=0$,有无数解;如果 $a=0$ 且 $b \neq 0$,无解。

1.3 二元一次方程组 (Linear Equations in Two Variables)

标准形式: \(\begin{cases} a_1x + b_1y = c_1 \\ a_2x + b_2y = c_2 \end{cases}\)

求解技巧

在数学课上我们学过“代入消元法”和“加减消元法”。在编程中,为了通用性,我们通常使用公式法(基于克莱姆法则 Cramer’s Rule)或者高斯消元法(对于更多元方程)。对于二元一次方程组,公式法最直接。

我们通过加减消元可以推导出 $x$ 和 $y$ 的通解公式:

令分母 $D = a_1b_2 - a_2b_1$。 如果 $D \neq 0$,则有唯一解:

\[x = \frac{c_1b_2 - c_2b_1}{a_1b_2 - a_2b_1}\] \[y = \frac{a_1c_2 - a_2c_1}{a_1b_2 - a_2b_1}\]

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <iomanip> // 用于保留小数
using namespace std;

int main() {
    // 求解方程组:
    // 2x + 3y = 8
    // 3x - y = 1
    double a1 = 2, b1 = 3, c1 = 8;
    double a2 = 3, b2 = -1, c2 = 1;

    double D = a1 * b2 - a2 * b1;

    if (D == 0) {
        cout << "无唯一解" << endl;
    } else {
        double x = (c1 * b2 - c2 * b1) / D;
        double y = (a1 * c2 - a2 * c1) / D;
        cout << "x = " << x << ", y = " << y << endl;
    }
    return 0;
}

输出x = 1, y = 2

1.4 一元二次方程 (Quadratic Equation)

这是初中数学的重难点,标准形式为 $ax^2 + bx + c = 0$ ($a \neq 0$)。

求根公式: 首先计算判别式 $\Delta = b^2 - 4ac$。

  1. $\Delta > 0$:有两个不相等的实数根 $x_{1,2} = \frac{-b \pm \sqrt{\Delta}}{2a}$。
  2. $\Delta = 0$:有两个相等的实数根 $x_1 = x_2 = -\frac{b}{2a}$。
  3. $\Delta < 0$:无实数根。

编程应用: 经常用于解决抛物线相关问题或物理运动轨迹计算。

1.5 绝对值与不等式

  • 绝对值:$x$ 表示数轴上 $x$ 到原点的距离。
    • 几何意义:$a - b$ 表示数轴上 $a, b$ 两点间的距离。
    • C++ 函数:abs(int) (在 <cstdlib><cmath>),fabs(double) / std::abs(double) (在 <cmath>,推荐统一用 std::abs)。
  • 不等式:编程中通常转化为 if 判断条件。例如 $ax > b$ (若 $a>0$) 转化为 if (a * x > b)。注意浮点数比较不要直接用 ==

二、平面几何基础:图形与面积

几何问题在编程中非常常见,主要涉及坐标计算和面积/周长公式。

2.1 常见面积公式

图形面积公式 ($S$)周长公式 ($C$)备注
长方形$a \times b$$2(a + b)$$a, b$ 为长和宽
正方形$a^2$$4a$$a$ 为边长
圆形$\pi r^2$$2 \pi r$$r$ 为半径,$\pi$ 常用 acos(-1.0)
三角形$\frac{1}{2} \times \text{底} \times \text{高}$$a+b+c$基础公式

2.2 勾股定理与距离公式 (Pythagorean Theorem)

勾股定理:直角三角形两条直角边 $a, b$ 的平方和等于斜边 $c$ 的平方,即 $a^2 + b^2 = c^2$。

坐标系两点间距离: 已知两点 $A(x_1, y_1)$ 和 $B(x_2, y_2)$,根据勾股定理,距离 $d$ 为: \(d = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}\)

这是计算几何中最基础的公式,几乎每道几何题都会用到。

2.3 三角形的存在性原理

判断三条线段 $a, b, c$ 能否组成三角形:

  • 任意两边之和大于第三边:$a+b>c$ 且 $a+c>b$ 且 $b+c>a$。
  • 任意两边之差小于第三边:$a-b<c$。

编程判断时,通常写全三个条件。

2.4 海伦公式 (Heron’s Formula) —— 三角形面积神器

在编程题中,经常会给出三角形三个顶点的坐标,求面积。或者直接给出三边长 $a, b, c$。 此时,求“高”比较麻烦,海伦公式是解决此类问题的首选。

步骤

  1. 先计算半周长 $p$: \(p = \frac{a + b + c}{2}\)
  2. 再计算面积 $S$: \(S = \sqrt{p(p-a)(p-b)(p-c)}\)

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cmath> // 必须包含 cmath 以使用 sqrt
using namespace std;

// 给出三边长求面积
double triangle_area(double a, double b, double c) {
    // 简单的三角形合法性判断 (两边之和大于第三边)
    if (a + b <= c || a + c <= b || b + c <= a) return 0.0; 
    
    double p = (a + b + c) / 2.0;
    return sqrt(p * (p - a) * (p - b) * (p - c));
}

2.5 坐标几何基础

  • 中点公式:点 $A(x_1, y_1)$ 和 $B(x_2, y_2)$ 的中点坐标为 $(\frac{x_1+x_2}{2}, \frac{y_1+y_2}{2})$。
  • 曼哈顿距离:$d =x_1 - x_2+y_1 - y_2$。常用于网格行走问题(只能走上下左右)。

2.6 几何中的 $\pi$

在 C++ 中使用 $\pi$ (圆周率),推荐使用反余弦函数 acos 计算,精度较高。

1
2
#include <cmath>
const double PI = acos(-1.0); // cos(PI) = -1, 所以 acos(-1) = PI

三、总结

  1. 方程思想:编程解方程更多是依赖公式推导。对于二元一次方程,熟记克莱姆法则(或者能够现场推导)非常有用。
  2. 几何公式:除了基础底乘高,海伦公式是竞赛高频考点,务必掌握。
  3. 浮点数精度:涉及几何和代数运算时,通常会出现小数。要注意使用 double 类型,并在判断相等时考虑精度误差(EPS)。

掌握这些基础数学工具,能让你在解决物理模拟、计算几何等类型的编程题目时游刃有余。


所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP 学习专题站:GESP WIKI

luogu-”系列题目可在洛谷题库进行在线评测。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权