宁波网站建设制作报价,网站建设需求表格,唐河企业网站制作怎么样,网页制作模板秋季文章目录 #x1f4af;题目#x1f4af;问题分析解法一#xff1a;减法法解法二#xff1a;位运算解法解法三#xff1a;逻辑非解法解法四#xff1a;条件运算符解法解法五#xff1a;数组映射法不同解法的比较 #x1f4af;小结 #x1f4af;题目 在蓝桥镇#xff0… 文章目录 题目问题分析解法一减法法解法二位运算解法解法三逻辑非解法解法四条件运算符解法解法五数组映射法不同解法的比较 小结 题目 在蓝桥镇妮妮发明了一个新的游戏——翻转游戏。游戏中有一个开关可以处于两种状态开用 1 表示和关用 0 表示。妮妮发现无论开关当前处于何种状态他都可以通过一次操作使得开关的状态翻转。现在妮妮告诉你开关当前的状态 x他想知道如果他做一次操作开关的状态会变成什么。你能帮助他解答这个问题吗
输入格式 输入仅一行包含一个整数 x (0 ≤ x ≤ 1)表示开关当前的状态。
输出格式 输出一行表示如果妮妮做一次操作后开关的状态。
样例输入
0样例输出
1在这个样例中开关当前的状态是关0所以妮妮做一次操作后开关的状态会变为开1。
运行限制
语言最大运行时间最大运行内存C1s128MC1s128MJava2s128MPython33s128M 问题分析 这个问题本质上是一个开关翻转问题开关的状态只有两种0 和 1。因此我们可以很方便地通过数学运算、位运算、逻辑运算等多种方式实现翻转操作。接下来我们将以 C 为例详细讲解每种方法的实现并分析其思路和适用性。 解法一减法法
这是最直观的一种解法即利用数学运算来实现状态翻转。我们知道开关有两种状态0 和 1。那么无论 x 的初始状态是 0 还是 1都可以通过 1 - x 的方式得到翻转后的状态。
代码实现
#include iostream
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin x;cout 1 - x endl;return 0;
}思路分析 对于当前状态 x
如果 x 为 0那么 1 - x 的结果为 1。如果 x 为 1那么 1 - x 的结果为 0。
通过简单的减法操作我们可以实现状态的翻转。这种解法简单明了代码也非常简洁易于理解。其计算量为常数级别时间复杂度为 O ( 1 ) O(1) O(1)适合大多数场景使用。 解法二位运算解法
利用位运算的异或操作^实现状态翻转也是一种很高效的方法。在二进制逻辑中异或操作可以用来做翻转。
0 ^ 1 11 ^ 1 0
也就是说当前状态与 1 做异或运算就可以实现翻转操作。
代码实现
#include iostream
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin x;cout (x ^ 1) endl;return 0;
}思路分析 在 C 中^ 是按位异或运算符。当两个位不同的时候结果为 1相同则为 0。因此 x ^ 1 的效果是
当 x 为 0 时0 ^ 1 得到 1。当 x 为 1 时1 ^ 1 得到 0。
这种解法的优点在于它利用了位运算的高效性。位运算的执行速度通常比数学运算更快因此在需要极高性能的场合位运算是不错的选择。 解法三逻辑非解法
我们还可以通过逻辑非运算符 ! 来实现状态翻转。在 C 中逻辑非运算符 ! 可以将布尔值的真假互换。
!0 true转为整数就是 1!1 false转为整数就是 0
代码实现
#include iostream
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin x;cout !x endl;return 0;
}思路分析 逻辑非运算符可以将 0 变为 1将 1 变为 0。虽然逻辑非运算符通常用于布尔逻辑判断但在这种只有 0 和 1 两个状态的问题中也可以巧妙地应用。利用逻辑非运算符的结果自动转换为整数可以实现状态翻转。 解法四条件运算符解法
条件运算符? :是 C 中的一种三目运算符可以根据条件的真假执行不同的操作。在这个问题中我们可以根据 x 的值选择输出 1 或 0。
代码实现
#include iostream
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin x;cout (x 0 ? 1 : 0) endl;return 0;
}思路分析 该解法利用了条件运算符的特点
当 x 0 时输出 1。当 x ! 0 时输出 0。
这种方法的好处在于可读性很强逻辑清晰明了适合用来增强代码的可维护性。 解法五数组映射法
我们可以定义一个数组将开关状态映射到它翻转后的状态。利用数组的索引可以很方便地实现状态翻转。
代码实现
#include iostream
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin x;int flip[2] {1, 0}; // 定义翻转表cout flip[x] endl;return 0;
}思路分析 在这个解法中我们定义了一个数组 flip其中
flip[0] 为 1flip[1] 为 0
输入的状态 x只能是 0 或 1可以直接作为数组的索引通过查表的方式得到翻转后的状态。这种解法的优点在于扩展性较好。如果将来状态种类增多只需要扩展数组即可代码的改动最小。 不同解法的比较 减法法 (1 - x) 优点简单、直观易于实现。缺点不够灵活对于状态数较多的场景不适用。 位运算解法 (x ^ 1) 优点利用位运算的高效性性能优异。缺点代码可能对某些不熟悉位运算的程序员不够直观。 逻辑非解法 (!x) 优点逻辑运算的方式实现状态翻转简单易懂。缺点逻辑非运算符通常用于布尔类型可能会降低代码的可读性。 条件运算符解法 (x 0 ? 1 : 0) 优点逻辑清晰代码可读性强。缺点代码稍显冗长相较于其他方法不够简洁。 数组映射法 (flip[x]) 优点扩展性好可以方便地增加状态种类。缺点对当前只有两种状态的情形而言显得有些多余。 小结 如果代码简洁性和易读性是主要考虑因素那么减法法 (1 - x) 是最优选择。如果需要追求极致的性能或者对位运算熟悉且希望代码执行效率更高位运算解法 (x ^ 1) 是不错的选择。如果问题需要在逻辑判断的基础上扩展为多状态翻转数组映射法可以提高代码的扩展性和可维护性。.