一、🧙♂️ 故事背景:魔法数字锁
小A来到了一个神秘宝箱前 🧰
宝箱上写着一行奇怪的咒语:
(x & i) + (x | i) == 2025👉 只有找到最小的正整数i
👉 才能打开宝箱!
二、🎯 任务目标
👉 输入一个数字x
👉 找到最小的正整数i,让:
(x & i) + (x | i) == 2025成立!
👉 如果找不到,就输出-1
三、算法分析:
1、🧠 第一步:认识两个魔法
(1)✨ 魔法1:&(按位与)
👉 规则:
1 & 1 = 1 其他情况 = 0👉 就像:
👉 “两个人都同意,才亮灯💡”
(2)✨ 魔法2:|(按位或)
👉 规则:
有1就等于1👉 就像:
👉 “只要有一个人同意,就亮灯💡”
2、🎭 第二步:进一步理解
假设:
x = 5 → 二进制 0101 i = 3 → 二进制 0011✏️ 计算
① 按位与
0101 &0011 ----- 0001 → 1② 按位或
0101 |0011 ----- 0111 → 7③ 相加
1 + 7 = 8👉 如果等于2025,就成功!
3、🧠 第三步:怎么找 i?
(1)🎯 关键思路
👉 i 是未知的
👉 我们可以使用枚举法:一个一个试!
(2)🎭 故事
我们像一个小侦探 🕵️♂️
👉 从 i = 1 开始试:
试 1 ❌ 试 2 ❌ 试 3 ❌ …… 直到找到!4、🧠 第四步:范围是多少?
我们可以:
for (int i = 1; i <= 2025; i++)👉 为什么?
👉 因为要的结果是 2025,x | i 的结果是大于等于i,所以,最大搜索到2025足够了。
👉 超过就没必要了!
5、✏️ 第五步:完整代码
#include <iostream> using namespace std; int main() { int x; cin >> x; for(int i = 1; i <= 2025; i++) { if((x & i) + (x | i) == 2025) { cout << i << endl; return 0; // 找到就结束 } } cout << -1 << endl; // 没找到 return 0; }6、🧪 第六步:举个完整例子
(1)🎯 输入
x = 5(2)🧠 过程
程序会:
i = 1 → 不行 i = 2 → 不行 i = 3 → 不行 …… 一直试!(3)🎉 如果某个 i 满足:
(x & i) + (x | i) == 2025👉 就输出它!如果,找不到,输出-1。
7、💡 第七步:超级重要的小技巧!
(1)🌟 技巧1:位运算不怕!
记住口诀:
& → 都是1才是1 | → 有1就是1(2)🌟 技巧2:暴力枚举!
👉 试试就试试(枚举)!范围要想好!
(3)🌟 技巧3:找到就结束!
return 0;👉 节省时间 ⚡
四、🎉 最终总结
👉 这题本质就是:
枚举 + 位运算五、🧙♂️ 一句话口诀
不会推?就枚举! 按位运算慢慢试!