C++ · 运算与表达式
整除与取模
比较整数与浮点除法,解释转换时机、向零截断与余数,用商余数和负数例子检验理解。
整数商与余数
想象把 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; | 整数商2 | 2.0 |
| double q = 5.0 / 2; | 浮点商2.5 | 2.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 判断整除关系非常简洁。
提示
- % 只能用于整数(int、long long),double 用 % 会编译错误。
- n % 10 取个位、n / 10 去个位、n / 10 % 10 取十位,是竞赛常用的"拆位"技巧。
- 注意负数取模:-7 % 3 在 C++ 中结果是 -1(余数与被除数同号),与数学定义稍有不同。
- 整除结果向零截断:-7 / 2 = -3(不是 -4)。
- a % b == 0 等价于"a 能被 b 整除",是判断倍数关系的标准写法。
先修知识
技术参考
范围说明
本站讲解由 InfoCode 编写,不是官方考纲;参考级别是本站映射,不代表官方等级、认证或参赛资格。练习记录不等于掌握或资格。
参考级别:GESP 1 级(本站映射)