跳转至

运算符与表达式

「表达式」就是由数据和运算符组成的算式,比如 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 的余数。别小看它,用法非常多:

cout << 17 % 5 << endl;   // 2 —— 17 除以 5 余 2
cout << 10 % 2 << endl;   // 0 —— 余 0 说明能被整除

三个经典应用:

  1. 判断奇偶:n % 2 == 0 是偶数,否则是奇数
  2. 取一个数的个位:n % 10
  3. 周期问题:今天是星期六,\(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--(自减)会在学循环时天天见到。

简单的类型转换

double d = 9.7;
int n = d;            // n = 9,直接砍掉小数
int m = (int)3.99;    // m = 3,强制转换,同样不是四舍五入

想要四舍五入?用小技巧:(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\)。

样例输入 / 样例输出

17 5
3
2

思路分析 两个运算符各司其职:/ 给商,% 给余数。注意 \(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
1 1 1

思路分析 拿 3661 秒当例子手推一遍就明白了:

  1. 小时数:\(3661 \div 3600 = 1\) 余 \(61\) → t / 3600
  2. 剩下的 61 秒里,分钟数:\(61 \div 60 = 1\) → t % 3600 / 60
  3. 末尾的秒数:\(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;
}

「大单位整除、小单位取余」——所有进制换算、单位换算都是这个套路。

动手试一试

  1. 读入一个三位数 \(n\),输出它的个位、十位、百位(提示:%10、/10%10、/100)
  2. 读入秒数 \(t\),把它换算成「X 小时 X 分 X 秒」输出(用 / 3600、% 3600 / 60…)
  3. 读入一个整数,判断它能不能被 3 和 5 同时整除(输出 yes 或 no——下一章学 if 之后你会做得更漂亮)

下一课,程序将学会「看情况做事」:第 2 章 · 分支与循环。