二级编程题里最常考的就是“把一个数拆成一位一位”。这一讲把这套基本功练扎实。
abs / sqrt / max / min / pow 等数学函数/(整除)和 %(取余)%10 和 /10 把数字一位位拆开(数位处理)用这些函数要在开头写 #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 |
sqrt 和 pow 返回的是小数,存进 int 会截断,必要时小心精度(如 (int)sqrt(n) 偶尔差 1)。两个都只用于整数:
/ 取商(丢小数):17 / 5 = 3% 取余数:17 % 5 = 2x % 2 == 0 是偶数。x % 3 == 0 说明 x 是 3 的倍数。x % 10;去掉个位:x / 10。很多二级编程题(数字统计、数位求和、判断回文…)都靠这两步:
个位 = 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)。数据范围小的时候,最朴实也最有效:用循环遍历每一种情况,逐个检查。
int cnt = 0;
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0) cnt++;
}
cout << cnt; // 14
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 % 10 和 23 / 10 各是多少?
23%10=3(个位),23/10=2(去掉个位)。Q2. 下面输出什么?int x=406,s=0; while(x>0){s+=x%10; x/=10;} cout<<s;
Q3. max(min(3,8), 5) 等于几?
min(3,8)=3,再 max(3,5)=5。Q4. 怎么判断整数 x 是偶数?
x % 2 == 0。Q5. 数 1~50 里 4 的倍数有几个?(写思路)
if(i%4==0) cnt++。答案 12 个(4,8,…,48)。abs/max/min 给整数,sqrt/pow 给小数(注意截断)。/ 取商丢小数,% 取余;都只用于整数。while(x>0) 拆完整个数。%2、倍数 %k==0。for 枚举 + if 判断。