4 数学函数与数位拆分
正在加载视频播放器…
GESP C++ 二级:数学函数与数位拆分精讲
核心目标:掌握常用数学函数
abs、sqrt、pow、max、min、floor、ceil、round的用法;掌握用%和/拆分整数各位数字,解决数位和、数字反转、回文数、水仙花数等问题。
数学函数让计算更简单;数位拆分靠“取余取个位,整除去个位”,循环处理每一位。
第一部分:数学函数
1. 头文件与函数总览
| 函数 | 头文件 | 功能 | 返回值类型 |
|---|---|---|---|
abs(x) |
<cstdlib> 或 <cmath> |
绝对值 | 整数或浮点 |
fabs(x) |
<cmath> |
浮点绝对值 | double |
sqrt(x) |
平方根 | ||
pow(x, y) |
x 的 y 次方 | ||
max(a, b) |
<algorithm> |
较大值 | 同参数类型 |
min(a, b) |
较小值 | ||
floor(x) |
<cmath> |
向下取整 | double |
ceil(x) |
向上取整 | ||
round(x) |
四舍五入 |
使用前通常包含:
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdlib>
//#include <bits/stdc++.h> //万能头内都包含
using namespace std;
2. 绝对值 abs / fabs
作用:求绝对值,即去掉负号。
int a = -5;
cout << abs(a) << endl; // 5
double x = -3.14;
cout << fabs(x) << endl; // 3.14
注意:
- 整数用
abs,浮点建议用fabs。 abs需要<cstdlib>或<cmath>。- 结果类型与参数类型相关。
3. 平方根 sqrt
作用:求平方根。
double x = 9.0;
cout << sqrt(x) << endl; // 3
int n = 16;
cout << sqrt(n) << endl; // 4
注意:
- 返回
double。 - 参数不能为负数(否则返回
nan)。 - 如果题目要求整数结果,可以转换:
(int)sqrt(n)。
4. 幂运算 pow
作用:求 (x^y)。
double a = pow(2, 3); // 8
double b = pow(2.0, 0.5); // 1.41421
注意:
- 返回
double。 - 参数可以是整数或浮点数。
- 整数幂结果可能有精度误差,简单题可直接用。
- 如果只需要整数结果,可转换:
(int)pow(2, 3)。
5. 最大值与最小值 max / min
作用:返回两个值中的较大或较小值。
int a = 3, b = 5;
cout << max(a, b) << endl; // 5
cout << min(a, b) << endl; // 3
也可以用于多个值:
int maxv = max(a, max(b, c));
int minv = min(a, min(b, c));
注意:
- 需要
<algorithm>。 - 两个参数类型要一致。
- 不能直接写
max(a, b, c),要嵌套。
6. 取整函数 floor / ceil / round
| 函数 | 功能 | 示例 | 结果 |
|---|---|---|---|
floor(x) |
向下取整 | floor(3.7) |
3.0 |
ceil(x) |
向上取整 | ceil(3.2) |
4.0 |
round(x) |
四舍五入 | round(3.5) |
示例:
double x = 3.7;
cout << floor(x) << endl; // 3
cout << ceil(x) << endl; // 4
cout << round(x) << endl; // 4
注意:
- 返回
double,赋给int会截断。 round是四舍五入,不是截断。floor向下,ceil向上。
7. 数学函数常见模型
7.1 求两数最大值
int a, b;
cin >> a >> b;
cout << max(a, b) << endl;
7.2 求平方根
double x;
cin >> x;
cout << fixed << setprecision(2) << sqrt(x) << endl;
需要 <iomanip>。
7.3 求幂
double base, exp;
cin >> base >> exp;
cout << pow(base, exp) << endl;
7.4 四舍五入
double x;
cin >> x;
cout << round(x) << endl;
7.5 判断完全平方数
int n;
cin >> n;
int r = (int)sqrt(n);
if (r * r == n) {
cout << "是完全平方数";
}
第二部分:数位拆分
8. 数位拆分核心公式
对于正整数 n:
| 需求 | 方法 | 示例(n=1234) |
|---|---|---|
| 取个位 | n % 10 |
4 |
| 去掉个位 | n / 10 |
123 |
| 取十位 | n / 10 % 10 |
3 |
| 取百位 | n / 100 % 10 |
2 |
| 取千位 | n / 1000 % 10 |
1 |
| 取第 k 位(从右往左,0 开始) | n / pow(10, k) % 10 |
需要 <cmath> |
口诀:
取个位,模 10;
去个位,除 10;
取某位,先除后模。
9. 循环分离各位数字
方法一:从右往左分离
int n;
cin >> n;
while (n > 0) {
int d = n % 10; // 取个位
cout << d << " ";
n /= 10; // 去掉个位
}
输入 1234,输出:
4 3 2 1
方法二:从左往右分离(需要先求最高位)
int n;
cin >> n;
int t = n;
int base = 1;
while (t >= 10) {
base *= 10;
t /= 10;
}
while (base > 0) {
int d = n / base % 10;
cout << d << " ";
base /= 10;
}
输入 1234,输出:
1 2 3 4
10. 数位和
int n, sum = 0;
cin >> n;
while (n > 0) {
sum += n % 10;
n /= 10;
}
cout << sum << endl;
输入 1234,输出 10。
11. 数位积
int n, prod = 1;
cin >> n;
while (n > 0) {
prod *= n % 10;
n /= 10;
}
cout << prod << endl;
输入 1234,输出 24。
注意:如果 n 可能为 0,需要特判。
12. 统计位数
int n, cnt = 0;
cin >> n;
if (n == 0) {
cnt = 1;
} else {
while (n > 0) {
cnt++;
n /= 10;
}
}
cout << cnt << endl;
特判 0:0 的位数是 1。
13. 数字反转
int n;
cin >> n;
int rev = 0;
while (n > 0) {
rev = rev * 10 + n % 10;
n /= 10;
}
cout << rev << endl;
输入 1234,输出 4321。
14. 回文数判断
回文数:正着读和倒着读一样,如 121、12321。
int n;
cin >> n;
int t = n;
int rev = 0;
while (t > 0) {
rev = rev * 10 + t % 10;
t /= 10;
}
if (rev == n) {
cout << "是回文数";
} else {
cout << "不是回文数";
}
15. 水仙花数
水仙花数:一个 3 位数,各位数字的立方和等于它本身。如 153 = 1³ + 5³ + 3³。
for (int n = 100; n <= 999; n++) {
int a = n / 100; // 百位
int b = n / 10 % 10; // 十位
int c = n % 10; // 个位
if (a*a*a + b*b*b + c*c*c == n) {
cout << n << " ";
}
}
输出:
153 370 371 407
16. 数字统计
统计某个数字出现的次数:
int n, target;
cin >> n >> target;
int cnt = 0;
while (n > 0) {
if (n % 10 == target) {
cnt++;
}
n /= 10;
}
cout << cnt << endl;
输入 1223 2,输出 2。
17. 数位拆分易错点
-
忘记特判 0
0的位数是 1,数位和是 0,反转是 0。 -
循环条件写错
用while (n > 0)处理正整数;如果n可能为负,先取绝对值。 -
取位顺序搞反
n % 10得到个位,n / 10 % 10得到十位。 -
数字反转时溢出
反转后的数可能超出int范围,大数用long long。 -
混淆
n /= 10和n %= 10
n /= 10去掉个位;n %= 10只保留个位。 -
忘记更新循环变量
每次循环必须n /= 10,否则死循环。 -
水仙花数范围错误
水仙花数是 3 位数,范围 100~999。 -
回文数判断时修改了原数
用临时变量t保存原数,不要直接改n。
第三部分:综合应用
18. 示例:求一个数的各位数字之和
#include <iostream>
using namespace std;
int main() {
int n, sum = 0;
cin >> n;
if (n == 0) {
cout << 0 << endl;
return 0;
}
while (n > 0) {
sum += n % 10;
n /= 10;
}
cout << sum << endl;
return 0;
}
19. 示例:判断质数(结合数学函数)
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
if (n < 2) {
cout << "不是质数";
return 0;
}
bool isPrime = true;
for (int i = 2; i <= (int)sqrt(n); i++) {
if (n % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) cout << "是质数";
else cout << "不是质数";
return 0;
}
20. 示例:完全平方数判断
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
int r = (int)sqrt(n);
if (r * r == n) {
cout << "是完全平方数";
} else {
cout << "不是完全平方数";
}
return 0;
}
第四部分:阅读程序写结果
题目 1
cout << abs(-7) << endl;
输出:
7
题目 2
cout << sqrt(16) << endl;
输出:
4
题目 3
cout << pow(2, 5) << endl;
输出:
32
题目 4
cout << max(3, 7) << " " << min(3, 7) << endl;
输出:
7 3
题目 5
int n = 1234;
cout << n % 10 << " " << n / 10 % 10 << endl;
输出:
4 3
题目 6
int n = 1234, sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
cout << sum << endl;
输出:
10
题目 7
int n = 1234, rev = 0;
while (n > 0) {
rev = rev * 10 + n % 10;
n /= 10;
}
cout << rev << endl;
输出:
4321
题目 8
int n = 121, t = n, rev = 0;
while (t > 0) {
rev = rev * 10 + t % 10;
t /= 10;
}
cout << (rev == n) << endl;
输出:
1
第五部分:速查表
| 需求 | 写法 |
|---|---|
| 绝对值(整数) | abs(x) |
| 绝对值(浮点) | fabs(x) |
| 平方根 | sqrt(x) |
| 幂 | pow(x, y) |
| 最大值 | max(a, b) |
| 最小值 | min(a, b) |
| 向下取整 | floor(x) |
| 向上取整 | ceil(x) |
| 四舍五入 | round(x) |
| 取个位 | n % 10 |
| 去掉个位 | n / 10 |
| 取十位 | n / 10 % 10 |
| 取百位 | n / 100 % 10 |
| 数位和 | while (n > 0) { sum += n % 10; n /= 10; } |
| 数位积 | while (n > 0) { prod *= n % 10; n /= 10; } |
| 数字反转 | rev = rev * 10 + n % 10; n /= 10; |
| 回文数 | 反转后与原数比较 |
| 位数统计 | 循环计数,注意 0 特判 |
| 水仙花数 | 百位、十位、个位立方和等于原数 |
第六部分:总结
数学函数与数位拆分是 GESP 二级的核心内容。
abs绝对值,fabs浮点绝对值。sqrt平方根,返回double。pow(x, y)求幂,返回double。max、min取最值,需要<algorithm>。floor向下,ceil向上,round四舍五入。- 数位拆分核心:取个位用
% 10,去个位用/ 10。 - 循环分离各位数字,从右往左依次取出。
- 数字反转用
rev = rev * 10 + n % 10。 - 回文数先反转再比较,注意保存原数。
- 特判 0:0 的位数是 1,数位和是 0。
复习建议:多练“阅读程序写结果”和“数位拆分综合题”,重点注意函数头文件、返回值类型、整数除法、取余、循环更新、0 的特判和反转溢出。考试中先判断需要哪种数学函数,再确定数位拆分的循环方式,最后检查边界和输出格式。