B22
案例:买书、休息时间、考试星期
引入
章前总览 三道真题都围着 / 与 %:买几本剩多少;秒数换成时分秒;星期循环用取余。
三道案例:
- 买书:本数 = m/13,剩余 = m%13
- 休息:先合成总秒,再拆回时分秒
- 星期:(x+n-1)%7+1
1 案例1:小杨买书
书单价 13 元,输入零用钱 m,输出最多买几本、还剩多少。
参考代码
#include <iostream>
using namespace std;
int main() {
int m;
cin >> m;
cout << m / 13 << endl; // 本数(整数商)
cout << m % 13 << endl; // 剩余
return 0;
}
- 样例:100 → 7 本剩 9;199 → 15 本剩 4。
2 案例2:休息时间
输入开始时 h、分 m、秒 s,再输入学习秒数 k,输出休息时刻。
思路
- 先变成总秒:
z = h*3600 + m*60 + s,再z += k。 - 再拆开:时
z/3600,然后z %= 3600;分z/60,再z %= 60得到秒。
参考代码
#include <iostream>
using namespace std;
int main() {
int h, m, s, k;
cin >> h >> m >> s;
cin >> k;
int z = h * 3600 + m * 60 + s;
z += k;
int hh = z / 3600;
z %= 3600;
int mm = z / 60;
z %= 60;
cout << hh << " " << mm << " " << z << endl;
return 0;
}
- 样例:12 59 59 再加 10 秒 → 13 0 9。
3 案例3:考试是星期几
今天星期 x(1~7,7=周日),n 天后是星期几?
为什么是 (x+n-1)%7+1
- 直接
(x+n)%7会得到 0~6,0 要当成 7。 - 公式
(x+n-1)%7+1把结果稳定映射到 1~7。
参考代码
#include <iostream>
using namespace std;
int main() {
int x, n;
cin >> x >> n;
cout << (x + n - 1) % 7 + 1 << endl;
return 0;
}
- 样例:今天 1,过 6 天 → 7;今天 5,过 1 天 → 6。
小结
三道题的共同武器:
/ 取整段(本数、小时、星期循环前的整圈)
% 取零头(剩余钱、剩余秒、星期落点)
✓
里程碑达成:
下一节再练购物、两时刻差、1~n 中 3 的倍数个数。