【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$。
- $\Delta > 0$:有两个不相等的实数根 $x_{1,2} = \frac{-b \pm \sqrt{\Delta}}{2a}$。
- $\Delta = 0$:有两个相等的实数根 $x_1 = x_2 = -\frac{b}{2a}$。
- $\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$。 此时,求“高”比较麻烦,海伦公式是解决此类问题的首选。
步骤:
- 先计算半周长 $p$: \(p = \frac{a + b + c}{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
三、总结
- 方程思想:编程解方程更多是依赖公式推导。对于二元一次方程,熟记克莱姆法则(或者能够现场推导)非常有用。
- 几何公式:除了基础底乘高,海伦公式是竞赛高频考点,务必掌握。
- 浮点数精度:涉及几何和代数运算时,通常会出现小数。要注意使用
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),考试认证学员交流,互帮互助
