第16章 常用数学函数
info

对应 GESP C++ 2 级知识块⑧:数学函数

官方要求:掌握常用的数学函数:绝对值函数、平方根函数、最大值函数、最小值函数、随机数函数,理解相应的算法原理。

头文件:C 语言用 <math.h>,C++ 推荐 <cmath>;随机函数额外引入 <cstdlib>(rand/srand)和 <ctime>(time)。大部分函数参数、返回值为 double 类型。

第16章 常用数学函数

16.1 绝对值函数

  1. int abs(int x):整数绝对值,接收 int;
  2. long labs(long x):长整型绝对值;
  3. double fabs(double x):浮点数绝对值。

示例:

abs(-9); // 9
fabs(-3.14); // 3.14

16.2 平方根函数

sqrt(x):平方根,要求 x≥0x \ge 0,返回 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 随机数函数

  1. rand():返回 0∼RAND_MAX0 \sim RAND\_MAX(一般 32767)之间的伪随机整数;
  2. srand(seed):设置随机种子,srand(time(NULL)) 保证每次运行序列不同;
  3. 生成区间 [a,b][a, b] 整数公式: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 级官方大纲内,但日常做题常用,列作拓展:

  1. pow(x, y):计算 xyx^y,两参数均为 double,pow(2, 3) = 8.0;
  2. ceil(x):向上取整,ceil(3.2) = 4,ceil(-2.1) = -2;
  3. floor(x):向下取整,floor(3.9) = 3,floor(-2.1) = -3;
  4. round(x):四舍五入,round(3.6) = 4,round(-2.3) = -2;
  5. fmod(x, y):浮点取余,fmod(5.3, 2) = 1.3。

16.6 使用注意

  1. 浮点函数运算结果为 double,赋值 int 会自动截断;
  2. sqrt、负数传入会出现未定义错误;
  3. 不写 srand 每次运行随机数完全一样;
  4. 混合运算注意类型转换,避免精度丢失。

练习题(2 级单选风格)

  1. abs(-7) 的返回值是?
    • A. -7
    • B. 7
    • C. 0
    • D. 1
  2. sqrt(9) 的返回值是?
    • A. 3
    • B. 4.5
    • C. 9
    • D. 81
  3. max(3, 8) 的返回值是?
    • A. 3
    • B. 8
    • C. 11
    • D. 5
  4. 使用 rand() 生成随机数但从未调用 srand(time(0)),后果是?
    • A. 编译报错
    • B. 每次运行都得到相同的随机数序列
    • C. 每次运行结果都不同
    • D. 程序崩溃
  5. 要生成 [0, n-1] 范围内的随机整数,正确写法是?
    • A. rand()
    • B. rand() % n
    • C. rand() + n
    • D. srand(n)
参考答案(点击展开)
  1. B — abs 返回绝对值,abs(-7)=7;整数绝对值用 <cstdlib> 的 abs,浮点用 <cmath> 的 fabs。
  2. A — sqrt 求平方根,sqrt(9)=3.0(返回 double)。
  3. B — max 返回两者中较大者,max(3,8)=8。
  4. B — 不调用 srand 播种,随机数发生器使用默认种子,每次运行产生相同序列;应在 main 开头 srand(time(0))。
  5. B — rand() % n 把随机值映射到 0~n-1;rand() 本身范围很大,需取余限定区间。
SShowball OI知识手册