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. 数位拆分易错点

  1. 忘记特判 0
    0 的位数是 1,数位和是 0,反转是 0。

  2. 循环条件写错
    用 while (n > 0) 处理正整数;如果 n 可能为负,先取绝对值。

  3. 取位顺序搞反
    n % 10 得到个位,n / 10 % 10 得到十位。

  4. 数字反转时溢出
    反转后的数可能超出 int 范围,大数用 long long。

  5. 混淆 n /= 10 和 n %= 10
    n /= 10 去掉个位;n %= 10 只保留个位。

  6. 忘记更新循环变量
    每次循环必须 n /= 10,否则死循环。

  7. 水仙花数范围错误
    水仙花数是 3 位数,范围 100~999。

  8. 回文数判断时修改了原数
    用临时变量 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 二级的核心内容。

  1. abs 绝对值,fabs 浮点绝对值。
  2. sqrt 平方根,返回 double。
  3. pow(x, y) 求幂,返回 double。
  4. max、min 取最值,需要 <algorithm>。
  5. floor 向下,ceil 向上,round 四舍五入。
  6. 数位拆分核心:取个位用 % 10,去个位用 / 10。
  7. 循环分离各位数字,从右往左依次取出。
  8. 数字反转用 rev = rev * 10 + n % 10。
  9. 回文数先反转再比较,注意保存原数。
  10. 特判 0:0 的位数是 1,数位和是 0。

复习建议:多练“阅读程序写结果”和“数位拆分综合题”,重点注意函数头文件、返回值类型、整数除法、取余、循环更新、0 的特判和反转溢出。考试中先判断需要哪种数学函数,再确定数位拆分的循环方式,最后检查边界和输出格式。