info
对应 GESP C++ 2 级知识块⑧:数学函数
官方要求:掌握常用的数学函数:绝对值函数、平方根函数、最大值函数、最小值函数、随机数函数,理解相应的算法原理。
头文件:C 语言用 <math.h>,C++ 推荐 <cmath>;随机函数额外引入 <cstdlib>(rand/srand)和 <ctime>(time)。大部分函数参数、返回值为 double 类型。
第16章 常用数学函数
16.1 绝对值函数
int abs(int x):整数绝对值,接收 int;long labs(long x):长整型绝对值;double fabs(double x):浮点数绝对值。
示例:
abs(-9); // 9
fabs(-3.14); // 3.14
16.2 平方根函数
sqrt(x):平方根,要求 ,返回 double。
sqrt(16); // 4.0
caution
sqrt 的坑
sqrt 只接受非负数,传入负数结果未定义(可能得到 NaN)。如果 x 可能是负数,先取绝对值:sqrt(fabs(x))。
16.3 最值函数
max(a, b)/min(a, b):取两数的最大、最小值(整数或同类型均可);fmax(a, b)/fmin(a, b):浮点版本。
int m = max(3, 7); // 7
int n = min(3, 7); // 3
tip
真题小例
输入 3 个整数 a、b、c,输出最大值:cout << max(max(a, b), c);。两层 max 即可,不必写一堆 if。
16.4 随机数函数
rand():返回 (一般 32767)之间的伪随机整数;srand(seed):设置随机种子,srand(time(NULL))保证每次运行序列不同;- 生成区间 整数公式:
a + rand() % (b - a + 1)。
完整示例:生成 5 个 1~10 的随机数
#include <iostream>
#include <cstdlib> // rand, srand
#include <ctime> // time
using namespace std;
int main()
{
srand(time(0)); // 播种,只需调用一次
for (int i = 0; i < 5; i++)
{
int num = 1 + rand() % 10; // 1 ~ 10
cout << num << " ";
}
return 0;
}
caution
不写 srand 的后果
如果只调用 rand() 而不调用 srand(time(0)),每次程序运行得到的"随机数"序列完全一样——因为种子固定。想每次不同,必须在程序开头(且只一次)调用 srand(time(0))。
16.5 补充函数(考试范围外,了解即可)
以下函数不在 2 级官方大纲内,但日常做题常用,列作拓展:
pow(x, y):计算 ,两参数均为double,pow(2, 3) = 8.0;ceil(x):向上取整,ceil(3.2) = 4,ceil(-2.1) = -2;floor(x):向下取整,floor(3.9) = 3,floor(-2.1) = -3;round(x):四舍五入,round(3.6) = 4,round(-2.3) = -2;fmod(x, y):浮点取余,fmod(5.3, 2) = 1.3。
16.6 使用注意
- 浮点函数运算结果为
double,赋值int会自动截断; sqrt、负数传入会出现未定义错误;- 不写
srand每次运行随机数完全一样; - 混合运算注意类型转换,避免精度丢失。
练习题(2 级单选风格)
abs(-7)的返回值是?- A. -7
- B. 7
- C. 0
- D. 1
sqrt(9)的返回值是?- A. 3
- B. 4.5
- C. 9
- D. 81
max(3, 8)的返回值是?- A. 3
- B. 8
- C. 11
- D. 5
- 使用
rand()生成随机数但从未调用srand(time(0)),后果是?- A. 编译报错
- B. 每次运行都得到相同的随机数序列
- C. 每次运行结果都不同
- D. 程序崩溃
- 要生成 [0, n-1] 范围内的随机整数,正确写法是?
- A.
rand() - B.
rand() % n - C.
rand() + n - D.
srand(n)
- A.
参考答案(点击展开)
- B —
abs返回绝对值,abs(-7)=7;整数绝对值用<cstdlib>的abs,浮点用<cmath>的fabs。 - A —
sqrt求平方根,sqrt(9)=3.0(返回double)。 - B —
max返回两者中较大者,max(3,8)=8。 - B — 不调用
srand播种,随机数发生器使用默认种子,每次运行产生相同序列;应在main开头srand(time(0))。 - B —
rand() % n把随机值映射到 0~n-1;rand()本身范围很大,需取余限定区间。