GESP C++ 二级 · 自学讲义 ③(共 4 讲)

数学函数 · 整除取余 · 数位处理

二级编程题里最常考的就是“把一个数拆成一位一位”。这一讲把这套基本功练扎实。

本讲学完你能

一、常用数学函数

用这些函数要在开头写 #include <cmath>max/min<algorithm>,用万能头 #include <bits/stdc++.h> 全都有)。

函数作用例子
abs(x)整数绝对值abs(-5)=5
sqrt(x)平方根(结果是小数)sqrt(9)=3.0
max(a,b)较大值max(3,7)=7
min(a,b)较小值min(3,7)=3
pow(a,b)a 的 b 次方(小数)pow(2,3)=8.0
易错sqrtpow 返回的是小数,存进 int 会截断,必要时小心精度(如 (int)sqrt(n) 偶尔差 1)。

二、整除 / 与取余 %

两个都只用于整数

超好用的小套路

三、数位处理(重点中的重点)

很多二级编程题(数字统计、数位求和、判断回文…)都靠这两步:

个位 = x % 10 ,然后 x = x / 10 去掉个位,循环直到 x 变 0。

例题:求各位数字之和
int x = 3729;
int sum = 0;
while (x > 0) {
    sum = sum + x % 10;   // 加上个位
    x = x / 10;           // 去掉个位
}
cout << sum;             // 3+7+2+9 = 21

变量表:x=3729→sum=9;x=372→sum=11;x=37→sum=18;x=3→sum=21;x=0 停。

例题:数一个数有几位
int x = 5048, cnt = 0;
while (x > 0) { cnt++; x /= 10; }
cout << cnt;             // 4 位
易错循环条件是 while(x > 0);如果题目允许 x 本身是 0,要特判输出(0 也是 1 位 / 各位和为 0)。

四、枚举:把所有可能都试一遍

数据范围小的时候,最朴实也最有效:用循环遍历每一种情况,逐个检查。

例题:1~100 里有几个 7 的倍数
int cnt = 0;
for (int i = 1; i <= 100; i++) {
    if (i % 7 == 0) cnt++;
}
cout << cnt;             // 14
例题:找出 100 以内同时是 3 和 5 倍数的数
for (int i = 1; i <= 100; i++) {
    if (i % 3 == 0 && i % 5 == 0) cout << i << " ";
}
// 15 30 45 60 75 90
套路看到“在某个范围里找/数满足条件的数”,就 for 遍历 + if 判断。条件多就用 && 连起来。

五、自测(先想,再点开看答案)

Q1. 23 % 1023 / 10 各是多少?

看答案23%10=3(个位),23/10=2(去掉个位)。

Q2. 下面输出什么?
int x=406,s=0; while(x>0){s+=x%10; x/=10;} cout<<s;

看答案10。各位 4+0+6=10。

Q3. max(min(3,8), 5) 等于几?

看答案5。先 min(3,8)=3,再 max(3,5)=5

Q4. 怎么判断整数 x 是偶数?

看答案x % 2 == 0

Q5. 数 1~50 里 4 的倍数有几个?(写思路)

看答案for i 从 1 到 50,if(i%4==0) cnt++。答案 12 个(4,8,…,48)。

六、速记卡