InfoCode

C++ · 运算与表达式

整除与取模

比较整数与浮点除法,解释转换时机、向零截断与余数,用商余数和负数例子检验理解。

InfoCode 编写 · 技术参考见下文

在应用中练这个知识点 在应用中阅读讲解

整数商与余数

想象把 17 颗糖平均分给 5 个人:每人得 3 颗(商),还剩 2 颗(余数)。在 C++ 里:

17 / 5 = 3(整除,取商的整数部分)
17 % 5 = 2(取模,取余数)

几个超级有用的技巧:
• n % 2 == 0 判断 n 是偶数;n % 2 != 0 判断 n 是奇数(也适用于负奇数)。
• n % 10 取出 n 的个位数字。
• n / 10 去掉 n 的个位(例如 123/10=12)。
• 循环中 i % 3 == 0 可以每隔 3 个执行一次操作。

注意:% 只能用于整数,不能用于 double。

为什么存进 double,5 / 2 还是2?

先决定表达式的运算,再把结果存入变量。两个整数相除先得到整数商,小数部分向零截断;接收变量的类型不会倒过来改变已经完成的除法。

语句先计算存入的值
double p = 5 / 2;整数商22.0
double q = 5.0 / 2;浮点商2.52.5
double r = static_cast<double>(5 / 2);先得2,再转换2.0

要保留这次除法的小数部分,应在除法前转换一个操作数,如 static_cast<double>(a) / b。向零截断不等于向下取整:-5 / 2 是−2,-5 % 2 是−1。这里假定除数不为0且商可表示;不满足时不能计算。取个位的例子限定非负整数,负数的余数不保证非负。

运行验证:转换放在哪一步

#include <iostream>
int main() {
    int a = 5, b = 2;
    double p = a / b;
    double q = static_cast<double>(a) / b;
    std::cout << p << " " << q << "\n";
    std::cout << -5 / 2 << " " << -5 % 2 << "\n";
}

先转操作数才得到2.5;转已经算出的整数商无法找回小数部分。

先自己判断,再展开答案

double x = 7 / 4; 的值是1.75吗?怎样改?

不是,是1.0。用7.0 / 4或在除法前转换一个操作数,这次商才是1.75。

17颗糖每组5颗,能分几组,还剩几颗?

17 / 5是3,17 % 5是2;3 × 5 + 2 = 17。

-7 / 2会得到−4吗?

不会,结果是−3。整数除法向零截断,不是向负无穷取整。

分组、数位与取余示例

例1:判断奇偶并提取个位数

#include <iostream>
using namespace std;
int main() {
    int n = 137;
    cout << n % 2 << endl;  // 1,说明是奇数
    cout << n % 10 << endl; // 7,个位
    cout << n / 10 << endl; // 13,去掉个位
    return 0;
}

137 % 2 = 1 说明 137 是奇数;137 % 10 = 7 取出个位;137 / 10 = 13 去掉个位。

例2:用取模做循环分组

#include <iostream>
using namespace std;
int main() {
    for (int i = 1; i <= 9; i++) {
        if (i % 3 == 0)
            cout << i << " 是3的倍数" << endl;
    }
    return 0;
}

输出:3 是3的倍数 / 6 是3的倍数 / 9 是3的倍数。i%3==0 判断整除关系非常简洁。

提示

先修知识

技术参考

范围说明

本站讲解由 InfoCode 编写,不是官方考纲;参考级别是本站映射,不代表官方等级、认证或参赛资格。练习记录不等于掌握或资格。

参考级别:GESP 1 级(本站映射)

查看赛事关系与路径