1 条题解

  • 0
    @ 2026-10-8 21:09:25

    数的性质

    一个自然的想法

    两个性质:性质 1 是偶数,性质 2 是大于 4 且不大于 12。四个人各自的喜好,最直白的写法就是四个独立的 if,把每种情况都手写一遍。能写对,但"恰好一个成立"这种条件手写起来分支多、容易乱。

    突破口:四个判断其实是逻辑运算符全家桶

    先把两个性质各算成一个 0/1 值存起来:

    int p1 = (x % 2 == 0);          /* 偶数 */
    int p2 = (x > 4 && x <= 12);    /* 大于4且不大于12 */
    

    有了 p1、p2,四个人的喜好正好各对应一种逻辑运算:

    人 含义 表达式
    小 A 两个都成立 p1 && p2(与)
    Uim 至少一个成立 p1 || p2(或)
    八尾勇 恰好一个成立 p1 != p2(异或)
    正妹 都不成立 !(p1 || p2)

    最值得说的是后两个:"恰好一个成立"就是两个布尔值不相等,恰好是异或运算;而"都不成立"不能图省事写成 p1 == p2——那样在"都成立"时也会输出 1,必须明确排除。

    代码实现

    #include <stdio.h>
    
    int main() {
        int x;
        scanf("%d", &x);
        int p1 = (x % 2 == 0);        /* 性质1:偶数 */
        int p2 = (x > 4 && x <= 12);  /* 性质2:大于4且不大于12 */
        printf("%d %d %d %d",
            p1 && p2,        /* 小A:与 */
            p1 || p2,        /* Uim:或 */
            p1 != p2,        /* 八尾勇:恰好一个(异或) */
            !(p1 || p2));    /* 正妹:都不成立 */
        return 0;
    }
    

    用样例验证:x = 12,偶数成立 p1 = 1,4 < 12 ≤ 12 成立 p2 = 1。于是小 A 1、Uim 1、八尾勇 0(两个都真,不属于恰好一个)、正妹 0,输出 1 1 0 0,与样例一致。

    容易出错的细节

    1. 性质 2 的边界是"大于 4 且不大于 12":不含 4,但含 12。写成 x > 4 && x < 12 会漏掉 12。
    2. 正妹不能简写成 p1 == p2:它把"都成立"的情况也算进去了。要么 !(p1 || p2),要么 !p1 && !p2。
    3. 四个输出的顺序是小 A、Uim、八尾勇、正妹,写反了顺序直接错。

    复杂度

    时间与空间复杂度均为 O(1)。

    这题的本质:认识四种基本逻辑运算——与、或、异或、非。其中"恰好一个成立"对应异或,这个对应关系以后会经常用到。

    信息

    ID
    511
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    4
    已通过
    3
    上传者