测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
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章基础知识自测。