B45
练习:工作日、平年、图书馆老鼠
引入
章前总览 继续练区间与否定:工作日用 and;平年是闰年的反面;老鼠啃书可用取余分支,也可用向上取整一式算完。
三道练习:
- weekday:1≤n≤5
- 平年:not 闰年,或拆成两段空白
- 老鼠:n - 向上取整(y/x)
1 练习1:工作日还是周末
输入星期数 n(1~7):周一到周五输出 weekday,六日输出 weekend。
参考代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
if (n >= 1 and n <= 5)
cout << "weekday" << endl;
else
cout << "weekend" << endl;
return 0;
}
- 数学上的 1≤n≤5 要写成
n>=1 and n<=5。 - 样例:6 → weekend;3 → weekday。
2 练习2:平年的判断
平年输出 yes,否则 no。两种写法:否定闰年条件,或直接描述“空白部分”。
参考代码(方法2)
#include <iostream>
using namespace std;
int main() {
int y;
cin >> y;
// 方法1:if (!((y%4==0 and y%100!=0) or y%400==0))
if (y % 4 != 0 or (y % 100 == 0 and y % 400 != 0))
cout << "yes" << endl;
else
cout << "no" << endl;
return 0;
}
- 方法2:不能被 4 整除,或(能被 100 整除但不能被 400 整除)。
- 样例:2022 → yes。
3 练习3:图书馆里的老鼠
有 n 本书,老鼠每 x 小时啃完一本(啃完前不换书)。求 y 小时后还剩几本完整的书。
思路
- 若 y 是 x 的倍数:刚好啃完
y/x本 → 剩n-y/x。 - 否则:啃完
y/x本,另有一本正在啃 → 剩n-y/x-1。 - 等价:啃掉本数 = 向上取整
(y+x-1)/x,答案n-(y+x-1)/x。
参考代码
#include <iostream>
using namespace std;
int main() {
int n, x, y, ans;
cin >> n >> x >> y;
if (y % x == 0)
ans = n - y / x;
else
ans = n - y / x - 1;
cout << ans << endl;
// 也可:cout << n - (y + x - 1) / x << endl;
return 0;
}
- 样例:n=10,x=2,y=3 → 8;n=5,x=2,y=4 → 3。
小结
逻辑题两步:
先想清“同时 / 或者 / 否定”
再翻译成 and / or / not(或 && || !)
✓
里程碑达成:
下一节做第8章基础知识自测。