运算符与表达式¶
「表达式」就是由数据和运算符组成的算式,比如 3 + 5 * 2。这一课我们把 C++ 的运算符过一遍——重点是整除和取余,它们是竞赛中最常用的运算。
算术运算符¶
| 运算符 | 含义 | 例子 | 结果 |
|---|---|---|---|
+ |
加 | 7 + 2 |
9 |
- |
减 | 7 - 2 |
5 |
* |
乘 | 7 * 2 |
14 |
/ |
整除(整数相除) | 7 / 2 |
3 |
% |
取余(模运算) | 7 % 2 |
1 |
特别注意:两个整数用 / 相除,结果直接舍去小数部分(不是四舍五入):
cout << 7 / 2 << endl; // 输出 3,不是 3.5
cout << -7 / 2 << endl; // 输出 -3(向零取整)
cout << 7.0 / 2 << endl; // 输出 3.5(有一个是小数,就按小数除)
想要小数结果?让除数或被除数至少有一个是 double。
% 取余:竞赛最爱¶
a % b 表示 a 除以 b 的余数。别小看它,用法非常多:
三个经典应用:
- 判断奇偶:
n % 2 == 0是偶数,否则是奇数 - 取一个数的个位:
n % 10 - 周期问题:今天是星期六,\(100\) 天后是星期几?
(6 + 100) % 7→ 星期日前的编号对 7 取余
乘方怎么写?
C++ 里 ^ 不是乘方(而是位运算,第 9 章再讲)。
\(2^8\) 可以写成连乘,或用 pow(2, 8)(需 #include <cmath>,返回 double 类型,慎用)。
优先级与括号¶
和数学一样,* / % 先于 + - 计算,同级从左到右:
cout << 3 + 5 * 2 << endl; // 13,先算乘法
cout << (3 + 5) * 2 << endl; // 16,括号优先
cout << 10 - 4 - 3 << endl; // 3,从左到右:(10-4)-3
拿不准就加括号——多写括号不扣分,写错优先级丢大分。
赋值与复合赋值¶
= 是赋值:把右边的值装进左边的变量(注意它不是数学里的「相等」):
int n = 5;
n = n + 1; // 把 n 的值 5 加上 1,再装回 n,现在 n 是 6
n += 1; // 等价于 n = n + 1,简写形式
n *= 2; // 等价于 n = n * 2,现在 n 是 14
n++; // 自增 1,现在 n 是 15
+= -= *= /= %= 都是同样的简写套路;n++(自增)和 n--(自减)会在学循环时天天见到。
简单的类型转换¶
想要四舍五入?用小技巧:(int)(3.99 + 0.5) 得 4。
例题 1:带余除法¶
题目描述 给定被除数 \(a\) 和除数 \(b\),输出 \(a \div b\) 的整数商和余数。
输入格式 一行两个整数 \(a\)、\(b\),保证 \(b \ne 0\)。
输出格式 两行:第一行是商,第二行是余数。
数据范围 \(1 \le a \le 10^9\),\(1 \le b \le 10^9\)。
样例输入 / 样例输出
思路分析 两个运算符各司其职:/ 给商,% 给余数。注意 \(a\)、\(b\) 都可能很大,用 long long 保险。
参考代码
#include <iostream>
using namespace std;
int main() {
long long a, b;
cin >> a >> b;
cout << a / b << endl;
cout << a % b << endl;
return 0;
}
例题 2:时间换算¶
题目描述 读入一个秒数 \(t\),把它换算成「小时 分 秒」输出。
输入格式 一个非负整数 \(t\)。
输出格式 一行三个整数:小时、分、秒,空格分隔。
数据范围 \(0 \le t \le 10^9\)。
样例输入 / 样例输出
思路分析 拿 3661 秒当例子手推一遍就明白了:
- 小时数:\(3661 \div 3600 = 1\) 余 \(61\) →
t / 3600 - 剩下的 61 秒里,分钟数:\(61 \div 60 = 1\) →
t % 3600 / 60 - 末尾的秒数:\(61 \% 60 = 1\) →
t % 60
参考代码
#include <iostream>
using namespace std;
int main() {
long long t;
cin >> t;
cout << t / 3600 << " " << t % 3600 / 60 << " " << t % 60 << endl;
return 0;
}
「大单位整除、小单位取余」——所有进制换算、单位换算都是这个套路。
动手试一试¶
- 读入一个三位数 \(n\),输出它的个位、十位、百位(提示:
%10、/10%10、/100) - 读入秒数 \(t\),把它换算成「X 小时 X 分 X 秒」输出(用
/ 3600、% 3600 / 60…) - 读入一个整数,判断它能不能被 3 和 5 同时整除(输出 yes 或 no——下一章学 if 之后你会做得更漂亮)
下一课,程序将学会「看情况做事」:第 2 章 · 分支与循环。