CC++ & Algorithm

整除的概念与性质

简单36
语言版本:通用
概述:用生活中的分东西场景引入整除的定义,讲解整除关系的性质和判断方法,并通过C++和Python代码展示如何检查一个数能否被另一个数整除。

整除原来这么简单:从糖果分配开始学整除

什么是整除?生活中的例子帮你秒懂

你有没有分过零食或糖果?假设你手里有 12 颗糖果,要平均分给 3 个好朋友。每个人能分到几颗?4 颗。而且正好分完,一颗不剩。这时候我们就说“12 能被 3 整除”。如果糖果是 13 颗,分给 3 个人,每个人分 4 颗后还会剩下 1 颗,那就不是“整除”了——这叫“有余数的除法”。

类似的事情还有很多:

  • 班上 40 名同学排成 4 列,每列正好 10 人,所以 40 能被 4 整除。
  • 但如果排成 6 列,每列 6 人还多 4 人,40 不能被 6 整除。
  • 妈妈买回 24 个橘子,要装进 8 个盘子,每个盘子装 3 个,正好装完,24 能被 8 整除。
  • 你存了 50 元零花钱,想买 7 元一本的笔记本,最多能买 7 本(49 元),还剩 1 元,所以 50 不能被 7 整除。

整除就是“恰好分完,没有余数”的意思。在数学和编程中,我们经常需要判断一个数是否能被另一个数整除。比如:

  • 判断一个年份是否是闰年(能被 4 整除但不能被 100 整除,或者能被 400 整除)
  • 判断一个数是否是偶数(能被 2 整除)
  • 判断一个数是否是3 的倍数(各位数字之和能被 3 整除)

掌握整除的概念和性质,就像学会了一把万能钥匙,能帮你打开数论和模运算的大门。

数学里的“整除”长什么样?

1. 严谨定义

ab 是两个整数,且 b ≠ 0。如果存在一个整数 q,使得 a = b × q,那么就说 b 整除 a,记作 b | a(读作“b 整除 a”)。这里 a 叫做被除数,b 叫做除数,q 叫做商。如果不存在这样的整数 q,就说 b 不整除 a,记作 b ∤ a

比如:

  • 因为 12 = 3 × 4,所以 3 | 12(3 整除 12)。
  • 因为 13 = 3 × 4 + 1,找不到整数 q 使 13 = 3 × q,所以 3 ∤ 13(3 不整除 13)。

注意:符号 “b | a” 中的竖线表示整除关系,不要把 “|” 和除法符号 “/” 混淆。b | a 是一个判断语句,结果是“真”或“假”;而 b / a 是数值除法,结果是商(可能是小数)。

2. 整除的五大性质(记住它们,解题快人一步)

这些性质在解题时非常有用,就像数学里的加速器。

性质 1:自反性
任何一个非零整数都能整除它自己。即 a | a(a ≠ 0)。
例子:5 | 5,100 | 100,-8 | -8。

性质 2:传递性
如果 a | b 且 b | c,那么 a | c。
例子:2 整除 4,4 整除 12,则 2 整除 12。
生活中的例子:如果你能 2 个一组地数糖果,又能 4 个一组地数,那肯定也能用 2 个一组数出 12 颗。

性质 3:线性组合
如果 a | b 且 a | c,那么对于任意整数 x、y,都有 a | (b × x + c × y)
通俗理解:如果 a 能整除 b 和 c,那么 a 也能整除 b 和 c 的任意倍数之和。
例子:3 整除 6,3 整除 9。取 x=2,y=3,则 6×2 + 9×3 = 12 + 27 = 39,39 ÷ 3 = 13,整除成立。
生活中:如果你有 6 颗糖和 9 颗糖,它们都能被 3 整除,那么把它们混合后(比如 2 份 6 颗+3 份 9 颗),总数 39 颗也能被 3 整除。

性质 4:乘积性质
如果 a | b,那么对于任意整数 m,有 a | (b × m)
也就是说,整除关系在乘法下保持。
例子:3 整除 6,那么 3 也整除 6×5=30,6×100=600。

性质 5:与绝对值的联系
如果 a | b 且 b ≠ 0,那么 |a| ≤ |b|。除数不能比被除数大(除非被除数为 0)。
例子:如果 7 整除 21,那么 |7| ≤ |21| 显然成立。但如果你说 15 整除 5,那不可能,因为 15 比 5 大。

特别重要的小结论:在编程中,判断整除最方便的方法是使用取模运算符 %。如果 a % b == 0,则 b 整除 a。因为取模运算得到的是余数,余数为 0 就意味着整除。比如 12 % 3 == 0,所以 3 | 12。

新手最容易犯的 3 个错误

错误 1:除数为 0

数学上规定除数不能为 0,编程中也一样。如果写 a % 0,程序会崩溃或报错。所以一定要先检查除数是否为 0

错误 2:搞混取模和整除的方向

a % b 是求 a 除以 b 的余数,不要搞反成 b % a。比如 12 除以 3,应该用 12 % 3,而不是 3 % 12(结果是 3,不是 0)。

错误 3:误解整除符号

在数学中 b | a 表示“b 整除 a”(b 是除数,a 是被除数),竖线像一根小棍,指向被除数。很多同学会写反成 a | b,意思就完全反了。记住:竖线左边是除数,右边是被除数

用代码说话:C++ 和 Python 实战判断整除

下面我们分别用 C++ 和 Python 写一个完整的程序,让用户输入两个整数,判断第一个数能否被第二个数整除,同时演示整除的传递性、线性组合等性质。

C++ 代码(带详细中文注释)

#include <iostream>
using namespace std;

int main() {
    // 演示1:从键盘输入两个正整数,判断整除
    int a, b;  // a: 被除数, b: 除数
    cout << "请输入两个整数(用空格分开):";
    cin >> a >> b;
    
    // 常见错误1:除数不能为0
    if (b == 0) {
        cout << "除数不能为0!" << endl;
        return 1;  // 返回1表示程序异常结束
    }
    
    // 使用取模运算符%判断余数是否为0
    if (a % b == 0) {
        cout << b << " 整除 " << a << endl;
    } else {
        cout << b << " 不整除 " << a << ",余数为 " << (a % b) << endl;
    }
    
    // 演示2:整除的传递性示例
    cout << "\n--- 传递性演示 ---" << endl;
    int x = 4, y = 12;  // x: 中间数, y: 大数
    // 检查 2|4 和 4|12
    bool cond1 = (x % 2 == 0);  // 2整除4? 真
    bool cond2 = (y % x == 0);  // 4整除12? 真
    if (cond1 && cond2) {
        // 根据传递性,应该有2整除12
        if (y % 2 == 0) {
            cout << "传递性成立:2整除4,4整除12,所以2整除12。" << endl;
        }
    }
    
    // 演示3:线性组合示例
    cout << "\n--- 线性组合演示 ---" << endl;
    int d = 3, e = 6, f = 9;  // d: 除数, e,f: 两个被除数
    int combo = e * 2 + f * 3;  // combo = 6×2 + 9×3 = 12+27=39
    if (e % d == 0 && f % d == 0) {
        if (combo % d == 0) {
            cout << "线性组合成立:3整除6和9,所以3整除(6×2+9×3=" << combo << ")" << endl;
        }
    }
    
    return 0;  // 程序正常结束
}

运行示例
输入 12 3 → 输出 “3 整除 12”
输入 13 3 → 输出 “3 不整除 13,余数为 1”
接着自动显示传递性和线性组合的验证结果。

Python 代码(带详细中文注释)

# 演示1:从键盘输入两个整数,判断整除
a = int(input("请输入第一个整数(被除数):"))  # a: 被除数
b = int(input("请输入第二个整数(除数):"))    # b: 除数

# 常见错误1:除数不能为0
if b == 0:
    print("除数不能为0!")
else:
    if a % b == 0:
        print(f"{b} 整除 {a}")
    else:
        print(f"{b} 不整除 {a},余数为 {a % b}")

# 演示2:整除的传递性
print("\n--- 传递性演示 ---")
x = 4   # x: 中间数
y = 12  # y: 大数
# 检查 2|x 且 x|y
cond1 = (x % 2 == 0)  # 2整除4
cond2 = (y % x == 0)  # 4整除12
if cond1 and cond2:
    if y % 2 == 0:
        print("传递性成立:2整除4,4整除12,所以2整除12。")

# 演示3:线性组合
print("\n--- 线性组合演示 ---")
d = 3  # d: 除数
e = 6  # e: 第一个被除数
f = 9  # f: 第二个被除数
combo = e * 2 + f * 3  # combo: 线性组合结果,6×2+9×3=39
if e % d == 0 and f % d == 0:
    if combo % d == 0:
        print(f"线性组合成立:3整除6和9,所以3整除(6×2+9×3={combo})")

运行结果与 C++ 相同。Python 中用 input() 获取字符串,必须用 int() 转换为整数。

完整代码示例(整合版本,可直接复制运行)

上面我们已经把各个部分写在了同一个程序里,你可以直接复制 C++ 或 Python 的完整代码到你的开发环境运行。如果想单独测试,只需要把主逻辑(输入判断+性质演示)放在一起即可。推荐先运行输入判断部分,感受一下整除的魔力。

总结:整除的核心要点

  1. 整除就是“恰好分完”,用数学语言说:存在整数 q 使得 a = b × q。
  2. 编程中判断整除用取模运算符 %,如果 a % b == 0 则整除。
  3. 整除有五大性质(自反、传递、线性组合、乘积、绝对值大小),这些性质可以帮助我们快速推理,比如:
    • 要判断一个数能否被多个数整除,可以先找它们的最大公因数。
    • 如果已知 a|b 和 a|c,那么 a 也能整除 b 和 c 的任意倍数之和。
  4. 常见错误:除数不能为 0;取模方向别搞反;数学符号 “|” 左边是除数、右边是被除数。
  5. 生活中的应用:排队、分东西、算零花钱、判断闰年、判断奇偶……到处都有整除的影子。

接下来学什么?

掌握了整除,你就可以继续学习:

  • 带余除法:当不能整除时,余数是多少?如何用公式表示?
  • 模运算(同余):余数之间的规律,比如 12 和 5 除以 7 都余 5,它们被 7 除同余。
  • 最大公约数与最小公倍数:怎么用整除性质快速求出来?
  • 质数与合数:整除性质是判断质数的关键。

整除是整个数论的起点,也是编程竞赛中常见的技巧。从今天开始,看到数字时就问问自己:“它能被谁整除?”养成这个习惯,数感会越来越好!

例题精讲

1单选题

下列哪一组数对中,左边的数能整除右边的数?

A7, 28
B5, 16
C6, 27
D12, 4
2单选题

若a能被b整除(b≠0),则a除以b的余数是?

A0
B1
Cb
D无法确定
3判断题

如果3能整除9,而9能整除27,那么3一定能整除27。

4填空题
判断整数n是否能被7整除的表达式是:if ( ___ )  cout << "能整除"; else cout << "不能整除";
5填空题
补全代码,使得当x能被y整除时输出"Yes",否则输出"No"(假设y≠0):if (___ ) cout << "Yes"; else cout << "No";