根据给定文件的信息,我们可以提炼出以下几个重要的知识点:
### 1. 最大公约数 (Greatest Common Divisor, GCD)
#### 函数定义
```pascal
function gcd(a, b: integer): integer;
```
该函数接收两个整数 `a` 和 `b` 作为参数,并返回它们的最大公约数。
#### 实现逻辑
使用递归的方式实现最大公约数的计算:
- 如果 `b` 为 0,则直接返回 `a`。
- 否则,递归调用 `gcd(b, a mod b)`。
### 2. 最小公倍数 (Least Common Multiple, LCM)
#### 函数定义
```pascal
function lcm(a, b: integer): integer;
```
该函数接收两个整数 `a` 和 `b` 作为参数,并返回它们的最小公倍数。
#### 实现逻辑
- 首先判断 `a` 和 `b` 的大小关系,确保 `a` 大于等于 `b`。
- 初始化 `lcm` 为 `a` 的值。
- 使用循环不断增加 `lcm` 的值,直到找到一个能被 `b` 整除的数为止。
### 3. 素数判断
#### 函数定义
```pascal
function prime(n: integer): boolean;
```
该函数接收一个整数 `n` 作为参数,判断它是否为素数,并返回布尔值结果。
#### 实现逻辑
- 循环遍历从 2 到 `sqrt(n)` 的所有整数。
- 如果在该范围内找到了能被 `n` 整除的数,则 `n` 不是素数,直接返回 `false`。
- 否则,返回 `true` 表示 `n` 是素数。
### 4. 筛选出小于 50000 的所有素数
#### 过程定义
```pascal
procedure getprime;
```
此过程用于找出并存储所有小于 50000 的素数。
#### 实现逻辑
- 使用 `Eratosthenes Sieve` 方法。
- 初始化一个布尔数组 `p` 来标记每个数字是否为素数,默认所有数字都是素数(除了 1)。
- 从 2 开始,如果当前数字是素数,则将其所有的倍数标记为非素数。
- 统计并保存所有素数到数组 `pr` 中。
### 5. Prim 最小生成树算法
#### 过程定义
```pascal
procedure prim(v0: integer);
```
该过程接收一个顶点 `v0` 作为起始点,构建图的最小生成树。
#### 实现逻辑
- 初始化 `lowcost` 数组存储每个顶点到起点的最短距离,`closest` 数组记录每个顶点最近的顶点。
- 通过多次迭代选择未加入树中的顶点中距离起点最近的一个顶点加入树中。
- 更新与加入顶点相邻的所有顶点的最短距离。
### 6. Kruskal 最小生成树算法
#### 过程定义
```pascal
procedure kruskal;
```
此过程用于构建图的最小生成树。
#### 实现逻辑
- 使用并查集数据结构。
- 将所有边按照权值从小到大排序。
- 依次处理每条边,若该边连接的两个顶点不在同一个集合中,则合并这两个顶点所在的集合,并将该边加入最小生成树中。
### 7. 深度优先搜索(Depth-First Search, DFS)
#### 过程定义
```pascal
procedure dfs;
```
该过程用于深度优先搜索算法。
#### 实现逻辑
- 使用栈或递归方式遍历图的所有顶点。
- 对每个未访问过的顶点进行深度优先搜索。
- 访问顶点的同时标记已访问状态,避免重复访问。
通过上述内容,我们回顾了经典的算法知识,包括最大公约数、最小公倍数的计算方法、素数判断以及最小生成树的两种实现方法(Prim 和 Kruskal)。这些算法不仅基础而且实用,在日常编程和算法竞赛中都有着广泛的应用。