🕐
同余与模运算
"%" 就是分糖果的零头;时钟就是 %12 的实体
💡 打个比方
17 颗糖分给小朋友,每人 3 颗,分给 5 个人后还剩 2 颗:17 % 3 = 2。"%" 就是"剩下的零头"。
时钟更妙:7 点再走 10 个小时,不是 17 点,而是 5 点——因为钟面只有 12 格,走满一圈又从头数:(7 + 10) % 12 = 5。
a ≡ b (mod m) 读作"a 与 b 模 m 同余",意思是:a 和 b 在 m 格时钟上站在同一格,也就是 a % m == b % m。
🖼️ 大图看明白
📏 玩同余,只要 3 步
- 第 1 步:a % m = 把 a 按每份 m 分完后的零头,一定在 0 ~ m-1 之间。
- 第 2 步:a ≡ b (mod m) 就是 a % m == b % m——两个数在 m 格时钟上站同一格。
- 第 3 步:同余的数可以加、减、乘:a≡b 且 c≡d (mod m) → a+c≡b+d、a−c≡b−d、a×c≡b×d (mod m)。
为什么能加减乘?两个数在时钟上站同一格,同时往前拨同样的步数(或一起转圈),还是站同一格。所以同余式两边不能随便除,但加减乘放心用。
💻 C++ 怎么写
// 验证同余性质:a≡b 且 c≡d (mod m) → a+c ≡ b+d (mod m)
#include <iostream>
using namespace std;
int main() {
int m = 12;
// 7 ≡ 19 (mod 12),因为 7%12 == 19%12 == 7
// 5 ≡ 17 (mod 12),因为 5%12 == 17%12 == 5
int a = (7 + 5) % m; // = 12 % 12 = 0
int b = (19 + 17) % m; // = 36 % 12 = 0
cout << a << " " << b << "\n"; // 0 0 同一格 ✓
// 时钟问题:h 点走 t 小时是几点(0~11 表示)
int h, t;
cin >> h >> t;
cout << (h + t) % m << "\n";
return 0;
}
✋ 你来试试
题目 1:2026 % 12 等于几?
12 × 168 = 2016,2026 − 2016 = 10。所以 2026 % 12 = 10,即 2026 ≡ 10 (mod 12)。
题目 2:如果 a ≡ b (mod m),那么 a + 5 和 b + 5 还同余吗?为什么?
还同余。(a+5) % m 和 (b+5) % m 相差的只是"先加了 5 再取余",结果仍然相等。时钟上就是:两人站在同一格,一起再走 5 格,还是站在同一格。所以 (a+5) ≡ (b+5) (mod m)。
🎯 一句话记住:% 是零头(0~m-1);a ≡ b (mod m) = 在 m 格时钟上站同一格;同余可以加减乘,不能乱除。