当前位置: 首页 > news >正文

关于数学函数和数据类型扩展的详细讲解(从属GESP二级)

本章内容

数学函数使用
数据类型扩展全解

让库函数做繁重算术,让你专注灵感与逻辑 —— 代码如诗,分数自来!

一、数学函数使用

1 📚 函数族全景图

功能

C 头文件

C++ 推荐头文件

主要原型(最常考)

等价/重载 & 备注

绝对值

<stdlib.h>

<cstdlib>

/ <cmath>

int abs(int)

long labs(long)

long long llabs(long long);在 <cmath> 里还有浮点重载double abs(double) / float abs(float) / long double abs(long double),本质调用 fabs

浮点绝对值

<math.h>

<cmath>

double fabs(double)

也有 float fabsf(float)long double fabsl(long double)

平方根

<math.h>

<cmath>

double sqrt(double)

float sqrtf(float)

long double sqrtl(long double)

取整 (四舍五入)

<math.h>

<cmath>

double round(double)

同族:floor(向下取整)、ceil(向上取整)、trunc(去尾)
——虽然大纲不必死记,但偶尔出题

最大\最小

<stdlib.h>

(宏)

<algorithm>

template<class T> T max(T a,T b);

min(a,b)


 

完整有三参版:max({a,b,c})
C++11 起支持 initializer_list

随机数

<stdlib.h>

<cstdlib>

int rand()

/ void srand(unsigned)

C++11 可用 <random> 真随机;
但二级考试统一考 rand()

万能头 vs 标准头

  • #include <bits/stdc++.h> 在 OJ / 考试环境可直接用,但记住对应正式头文件,万一机考不支持万能头能立刻拆分。
  • • 凡是浮点函数,“返回 double”是核心考点——特别是填空题会用“返回类型”来卡分。

2 🔬 语义+类型陷阱深挖

2.1 abs / fabs / std::abs

输入

可能返回

潜在坑

int

(-2147483648)

未定义

→ 溢出

题目爱考:abs(INT_MIN) 不安全,结果仍是负数

double

(-3.7) 用 abs

3 → 被隐式截断!(doubleint 调用 abs(int) 版)

只能 fabs(-3.7)std::abs(-3.7)

三目运算自己写 x<0?-x:x

溢出同上

建议优先库函数

真题·判断:“abs(-3.2) 的结果是 3.2” → (3)

2.2 sqrt

常考点 = 浮点误差 + 非负判定

double r = sqrt(16);          // 4.0
bool ok = (sqrt(10)*sqrt(10) == 10);  // 可能 false

真题·单选:“若 xdouble,表达式 sqrt(x)*sqrt(x)==x 恒为真吗?” → ,要用 fabs(...)<1e-9

2.3 round / floor / ceil / trunc

函数

3.2 →

-3.2 →

易混点

round

3

-3

“四舍五入到最近整数”

floor

3

-4

“向下” ⟹ 不一定绝对值增大

ceil

4

-3

“向上” ⟹ 不一定绝对值增大

trunc

3

-3

丢掉小数部分

补充:大纲主考 round,但 2024-12 卷出现“floor 的返回值是 ___?”的填空,一旦见到要能秒答。

2.4 max/min

  • • 宏污染:若先 #define max(某些旧库),std::max 会被替换导致编译错。写题时养成加 std:: 前缀。
  • • 三参:max({a,b,c}) (C++11);或两层:max(max(a,b),c)——这个写法经常出现在填空题里考“括号匹配”。

2.5 rand / srand

  1. 1. rand() 范围0 ~ RAND_MAX (常为 32767)
  2. 2. 均匀映射方案
    • [0,k-1]rand()%k
    • [1,k]rand()%k+1
    • [l,r]rand()%(r-l+1)+l
  1. 3. 种子只调一次:srand(static_cast<unsigned>(time(nullptr)));
  2. 4. 概率题常考:生成 1000 次模拟骰子;或判断 (rand()%2) 得到 0/1 概率是否均为 0.5。

3 🔧 真题级“套路”拆解

类型

题型原句(缩写)

考点

速答

单选

“以下表达式值为 5 的是?” 选项有 round(4.6)

四舍五入

5

判断

“调用 sqrt(-1) 会返回 NaN”

运行结果

对;且会 domain error

填空

“生成 1–100 随机整数: rand()% ___ +1

模 ±1

100

选择

“以下选项能比较浮点 ab 是否几乎相等”

绝对误差

fabs(a-b)<=1e-6

编程

“输入 n,输出 1 ~ n 中绝对值 ≤ 2 的整数平方根之和(保留2位)”

abs

+sqrt+格式化

cout<<fixed<<setprecision(2)


4 🛠 实战模板 & 扩展技巧

4.1 统一随机函数封装

int rng(int l, int r) {            // 闭区间 [l,r]return rand() % (r - l + 1) + l;
}
  • • 编译器常量折叠考点:如果 lr 为字面值,考题会问“此函数返回值个数是 ___ ?”答案= r-l+1

4.2 快速近似比较

bool equal(double a,double b,double eps=1e-9){return fabs(a-b)<=eps;
}
  • • 真题曾考:“eps 默认值放在 .h 文件里是否可行?” → 可行,只要声明与定义保持一致。

4.3 整数平方判定(≥ 1e9 安全版)

bool isSquare(long long x){long long r = (long long)(sqrt((long double)x)+0.5); // 先转 long double, +0.5 抗误差return r*r==x;
}
  • • 填空题爱出 +0.5 的用途:减少浮点误差

5 📝 “加一级难度”练习

  1. 1. 随机打乱

读入 n (< 100) 个整数,要求随机输出其一个全排列
提示:用 std::shuffle(v.begin(),v.end(),std::default_random_engine(time(0)));若局限 rand(),可写 Fisher-Yates

  1. for(int i=n-1;i>0;--i) swap(v[i],v[rng(0,i)]);
  2. 2. 开根误差

输入整数 k (1≤k≤10^6),输出最小 n 使 sqrt(n) 的小数部分≥ 0.999。
提示

  1. while(true){ n++; double z=sqrt(n); if(z-floor(z)>=0.999) break; }
  2. 3. 比赛评分

7 个评委打分(浮点),去掉最高与最低后取平均;要求四舍五入到 1 位小数。
提示: round(sum/5*10)/10 or cout<<fixed<<setprecision(1)


6 ⚠ 容易丢分的 4 件小事

  1. 1. 忘记 std:: 命名空间
    • • 选择题经常放选项 max(a,b)std::max(a,b),考哪一个能编译。
  1. 2. 类型提升陷阱
    • abs(a-b)<=0.1a,bint,表达式恒 0/1;要保证它们是 double
  1. 3. rand() 取模偏差(进阶)
    • • 当 RAND_MAX 不能被 (r-l+1) 整除,大数据模拟会产生轻微偏斜。二级通常不深究,但加分题可能问。
  1. 4. sqrt 输入负数
    • • 行为未定义,在线判题常直接 nan;考试机考选择题会给 domain error

🗂️ 二、数据类型扩展全解


1 🌳 数据类型家族速览

类别

关键成员

关键词/后缀

必考点

整型

char

shortintlonglong long

补语:signed / unsigned;字面量后缀:ULLL

字节数、范围、溢出规则

字符

char

/ char8_t† / char16_t / char32_t / wchar_t

字面量前缀:u8'字'u'字'U'字'L'字'

Unicode 扩展、宽字符 I/O

浮点

float

doublelong double

字面量后缀:f / F / l / L

精度、舍入误差、epsilon

布尔

bool

常量:true / false

与整型的隐式转换

枚举

enum {…}

enum class {…}

位域、作用域限定

枚举到整型的提升

特殊

void

std::nullptr_t

空类型、空指针常量

只能做指针转换

C99 定宽

int8_t

uint64_t

头文件 <cstdint>

容易在填空题出现


2 🧩 整型版图 —— 字节、范围、陷阱

2.1 统一表格

关键字

最小宽度†

考试机器(64-bit GCC)

常见范围 (十进制)

signed char

8 bit

1 byte

−128 ~ 127

unsigned char

8 bit

1 byte

0 ~ 255

short

/ short int

16

2 bytes

−32768 ~ 32767

unsigned short

16

2 bytes

0 ~ 65535

int

16

4 bytes

−2 147 483 648 ~ 2 147 483 647

unsigned int

16

4 bytes

0 ~ 4 294 967 295

long

32

8 bytes(LLP64*例外)

约 ±9.22e18

long long

64

8 bytes

同上

unsigned long long

64

8 bytes

0 ~ 1.84e19

2.2 溢出规则

场景

行为

真题套路

有符号整型溢出

未定义

(UB)

判断题:“int a=INT_MAX; a++; 结果为 INT_MIN” → (UB)

无符号溢出

按 2^n 取模

单选:“unsigned char c=255; c++ 等于 ___” → 0

混合运算提升

先提升到 int/unsigned

填空:char c=-1; int x= c; → −1 (若 char 有符号)


3 🔬 浮点精度与比较

类型

字节

有效十进位

典型 ε (numeric_limits<T>::epsilon())

float

4

6 ~ 7

1.19e-7

double

8

15 ~ 16

2.22e-16

long double

(x86-64)

16(10)

18 ~ 19

1.08e-19

  • 比较模板
bool d_equal(double a,double b,double eps=1e-9){return std::fabs(a-b)<=eps;
}
  • 真题暗雷

double s = 0.1+0.2; printf("%.17f",s); 输出不等于 0.300000…”
考点:二进制小数误差;调 setprecision(17) 看到 0.30000000000000004。


4 📝 字面量与后缀

写法

推导类型

备注

42

int

最短类型能装就选

42u

/ 42U

unsigned int

真题常让填 u

42l

/ 42L

long


 

42ll

/ 42LL

long long


 

0x1'F3

(C++14)

int

十六进制,撇号可分隔

数字可读性

3.14

double

默认双;千万别默认为 float

3.14f

/ 3.14F

float


 

3.14L

long double

windows x64 仍 8 bytes


5 📦 sizeofdecltypeauto

int  a = 5;
long b = 6;
cout << sizeof(a) << sizeof 'A';   // 4 1 (单引号为 char)
auto  c = a + b;                   // c 推为 long
decltype(a+b) d;                   // 与 c 同型

填空常问:sizeof(0ULL) -> 8;sizeof "abc" -> 4 (含终止 0)。


6 🎨 枚举与 enum class

enum Color { RED, GREEN=5, BLUE };       // 隐式转 int
enum class Dir : unsigned char { N,S,E,W }; // 强作用域 + 自定底层

考点

题型

速解

隐式提升

Color c=RED; int x=c;” 合法? → 合法

普通 enum

作用域

Dir d=Dir::N; cout<<d; 编译错” →

无流插;需显式强转


7 ⚙️ typedef vs using

typedef unsigned long ull;
using  ull2 = unsigned long;
  • • 选择题常抛 using,问两者是否等价 ➟ 等价
  • • 模板别名只能用 using:template<class T> using vec = std::vector<T>;

8 🚧 真题高频坑位

关键词

坑点

记忆法

char

默认符号性

signed

or unsigned 平台相关

考卷若问范围,答“依实现,通常 −128~127”

整数提升

unsigned short + int → int

?

先都升至 int,再运算

移位超位宽

1<<32

在 32-bit UB

题目若给 x<<31 需看 int 还是 unsigned

布尔加减

bool b=true; cout<<b+5;

→ 6

true→1, false→0

结构体对齐

机考编程:sizeof(struct{char c;int x;}) → 8(或12/16)

末尾对齐到最大成员


9 🛠️ 练手 mini-task

  1. 1. 打印各基本类型字节数:写一行循环 cout<<typeid(T).name()<<...
  2. 2. 安全读取宽字符:输入 UTF-8,存入 std::u32string,统计码点数。
  3. 3. 模拟无符号溢出计数器uint8_t t=250; for(int i=0;i<10;++i) cout<<(int)(t++); 📈

三、精选选择题(10题)

✅ 1. 【数学函数使用 · 真题】

题目:在 C++ 中,下面哪条语句最适合连续 5 次正确生成 1 到 10 之间的随机整数?
A. rand() % 11 B. rand() % 10
C. rand() % 10 + 1 D. rand() % 9 + 1
答案:C
解析rand() 产生 0 – RAND_MAX 的伪随机数,先 % 10 得到 0 – 9,再 + 1 即可映射为 1 – 10。
【出自:25 年 3 月题 14】


✅ 2. 【数学函数使用 · 真题】

题目:若 ab 均为 float,要判断它们“几乎相等”(误差 ≤ 0.000001)应选用:
A. (b-a) < 0.000001 B. (b-a) <= 0.000001
C. abs(b-a) <= 0.000001 D. sqrt(b-a) <= 0.000001
答案:C
解析:浮点数可能一大一小,必须取 “距离” abs(b-a);误差范围采用 ≤。
【出自:25 年 3 月题 15】


✅ 3. 【数学函数使用 · 真题】

题目:下列 4 个表达式中,结果不是整数 8 的是:
A. abs(-8) B. min(max(8, 9), 10)
C. int(8.88) D. sqrt(64)
答案:B
解析max(8, 9) 得 9,随后 min(9, 10) 仍为 9;其余三个都等于 8。
【出自:24 年 3 月题 5】


✅ 4. 【数学函数使用 · 真题】

题目:下面哪行代码能在 1-100 之间找出所有完全平方数(如 16 是 4²)?
A.int(sqrt(i))*int(sqrt(i)) = i
B.int(sqrt(i)) == sqrt(i)
C.int(sqrt(i))*int(sqrt(i)) == i
D.int(sqrt(i)) = sqrt(i)
答案:C
解析:对i开平方后再平方,与原数相等即可判定i为完全平方数;需两侧均为表达式,且用比较运算符==
【出自:23 年 12 月题 11】


✅ 5. 【数据类型扩展 · 真题】

题目:若 char a保存某字符,下列哪一表达式可以判断a是否为数字字符?
A.'0' <= a && a <= '9' B.'1' <= a && a <= '0'
C.'0' <= a <= '9' D.'1' <= a <= '0'
答案:A
解析:字符本质是整数(ASCII),用区间比较最安全;'0''9'连续。
【出自:23 年 6 月题 12】


✅ 6. 【数据类型扩展 · 真题】

题目:若 char a = 'C'; 下面 C++ 语句 cout << (a + 2); 的输出是:
A. E B. C+2 C. C2 D. 69
答案:D
解析'C' 的 ASCII 是 67;字符参与算术先提升为 inta + 2 是 69,按整数格式输出。
【出自:23 年 6 月题 10】


✅ 7. 【数据类型扩展 · 真题】

题目a、b、c、d 全为 int,求它们平均值应写:
A. (a+b+c+d)/4 B. (a+b+c+d)%4
C. (a+b+c+d)/4.0 D. (a+b+c+d)%4.0
答案:C
解析:若除数是整数 4 则仍做整数除法;加上 .0 让表达式晋升为浮点,得到精确均值。
【出自:23 年 3 月题 8】


✅ 8. 【数据类型扩展 · 真题】

题目:C++ 表达式 int(-123.123 / 10) 的值是:
A. -124 B. -123 C. -13 D. -12
答案:D
解析-123.123 / 10 ≈ -12.3123,向 0 截断得到 -12。
【出自:23 年 9 月题 5】


✅ 9. 【数据类型扩展 · 真题】

题目:在 C++ 中,下面哪条语句能直接取得正整数 N 的个位数字?
A. N % 10 B. N / 10 C. N && 10 D. 以上都不行
答案:A
解析:模运算 % 得到除以 10 的余数,即个位。
【出自:24 年 9 月题 7】


✅ 10. 【数据类型扩展 · 真题】

题目:执行 cout << (5 / 2 + 5 % 3); 的输出是:
A. 1 B. 2 C. 4 D. 5
答案:C
解析5/2 做整除得 2,5%3 得 2,总和 2+2=4。
【出自:24 年 9 月题 5】

三、精选判断题(10题)

✅ 1. 【数学函数使用·真题】

题目:在 C++ 代码中,若 N 为正整数,则表达式 N - N / 10 * 10N % 10 得到的结果始终相同。
答案:对
解析N / 10 进行整数除法去掉个位后再反推,可得到与取模 % 10 完全相同的余数。
【出自:25 年 3 月判断题】


✅ 2. 【数学函数使用·真题】

题目:对任何正整数 N,判断式 (sqrt(N) * sqrt(N)) == N 一定返回 true
答案:错
解析sqrt 返回 double,两次浮点运算会引入误差,比较结果并非总为真。
【出自:25 年 3 月判断题】


✅ 3. 【数据类型·真题】

题目:若 double x = 16.44;,执行 cout << x / 10; 时输出结果固定为 1
答案:错
解析x / 101.644double 型),不会被截断为整数 1。
【出自:24 年 6 月判断题】


✅ 4. 【数据类型·真题】

题目:执行

int N = 10;
cout << N / 4 << "->" << N % 4 << "->" << N / 4.0;

输出应为 2->2->2.0
答案:错
解析:最后一次除数为 4.0 会晋升为浮点运算,结果是 2.5,因此实际输出 2->2->2.5
【出自:24 年 6 月判断题】


✅ 5. 【数据类型·判断】

题目:表达式 ('0' <= ch && ch <= '9') 能正确判断字符 ch 是否为数字字符。
答案:对
解析:字符在算术比较中按 ASCII 值参与运算,数字区间 '0''9' 连续,用区间判断最安全。
【出自:23 年 6 月选择题改编】


✅ 6. 【数据类型】

题目:若 char c = 'C';,执行 cout << (c + 2); 将输出字符 E
答案:错
解析'C' 的 ASCII 为 67,c + 2 先提升为 int,结果 69,以整数形式输出而非字符。
【出自:23 年 6 月选择题改编】


✅ 7. 【数据类型】

题目:在 C++ 中,表达式 (a + b + c + d) / 4 能得到四个 int 数的精确平均值(含小数部分)。
答案:错
解析:除数为整数 4,整体做整数除法,小数部分被截掉;需写 / 4.0 才能保留小数。
【出自:23 年 3 月选择题改编】


✅ 8. 【数据类型】

题目:C++ 表达式 int(-123.123 / 10) 的计算结果为 -12
答案:对
解析-123.123 / 10 ≈ -12.3123,强转 int 向 0 截断,结果为 -12
【出自:23 年 9 月选择题改编】


✅ 9. 【数学函数使用】

题目rand() % 10 + 1 可以生成的随机整数范围是 1 – 10(含 10)。
答案:对
解析rand() % 10 得 0 – 9,再 + 1 映射为 1 – 10。
【出自:25 年 3 月选择题改编】


✅ 10. 【数据类型】

题目:在 C++ 代码中,表达式 N % 10 可以用来获取正整数 N 的个位数字。
答案:对
解析:取模 % 10 保留除以 10 后的余数,即个位数。
【出自:25 年 3 月判断题】

http://www.lqws.cn/news/475885.html

相关文章:

  • 30天pytorch从入门到熟练(day1)
  • Mybatis-Plus支持多种数据库
  • 【机器学习四大核心任务类型详解】分类、回归、聚类、降维智能决策指南
  • 多项目预算如何集中管控与动态调整
  • 将Linux装进口袋: Ubuntu to Go 制作
  • 【Linux】进程间多种通信方式对比
  • Typescript基础
  • 【后端】负载均衡
  • MiniMax-M1 开源,Kimi 深度研究内测,GPT-5 今夏发布,Gemini 2.5 稳定上线!| AI Weekly 6.16-22
  • 大模型MetaGPT面试题汇总及参考答案
  • Python-break、continue与else语句
  • OJ搭建:Judge0服务器、DeepSeek服务接入简介
  • 70、爬楼梯
  • 相机camera开发之差异对比核查四:测试机和对比机的Camera动态参数差异对比及关键字
  • 笨方法学python-习题1
  • 设计模式精讲 Day 10:外观模式(Facade Pattern)
  • 无锡哲讯科技:助力纺织业搭乘 SAP 数字化快车
  • [xiaozhi-esp32] 应用层(9种state) | 音频编解码层 | 双循环架构
  • OpenGL ES 中的材质
  • 《高等数学》(同济大学·第7版)第五章 定积分 第二节微积分基本公式
  • ASP.NET Core API文档与测试实战指南
  • 创建 Vue 3.0 项目的两种方法对比:npm init vue@latest vs npm init vite@latest
  • Perplexity AI:对话式搜索引擎的革新者与未来认知操作系统
  • 腾讯AI音乐黑科技,LeVo引领音色与创作新风潮
  • 计算机组成原理复习笔记
  • 汽车毫米波雷达增强感知:基于相干扩展和高级 IAA 的超分辨率距离和角度估计.
  • flink如何支持kafka容灾自动切换
  • 一次性理解Java垃圾回收--简单直接方便面试时使用
  • 半导体二极管
  • C# Quartz.net 定时任务