1 条题解
-
0
数的性质
一个自然的想法
两个性质:性质 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,与样例一致。容易出错的细节
- 性质 2 的边界是"大于 4 且不大于 12":不含 4,但含 12。写成
x > 4 && x < 12会漏掉 12。 - 正妹不能简写成
p1 == p2:它把"都成立"的情况也算进去了。要么!(p1 || p2),要么!p1 && !p2。 - 四个输出的顺序是小 A、Uim、八尾勇、正妹,写反了顺序直接错。
复杂度
时间与空间复杂度均为 O(1)。
这题的本质:认识四种基本逻辑运算——与、或、异或、非。其中"恰好一个成立"对应异或,这个对应关系以后会经常用到。
- 性质 2 的边界是"大于 4 且不大于 12":不含 4,但含 12。写成
- 1
信息
- ID
- 511
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 4
- 已通过
- 3
- 上传者