问题描述:
哈利波特不经意间进入了一座古墓,古墓入口有一道大门,内部有六个密室,每个密室中藏有一件兵器。已知需要两个密码才能从里面打开密室和大门,取出密室内的兵器后从大门撤出。
两个密码均是不大于63的整数,将其转化为八位二进制数后对应位进行“与”运算(运算的规则是:当两个位均为“1”时,结果为“1”,否则结果为“0”)。将“与”运算的结果从右往左数,当第n位为1时,表示可以打开第n个密室,取出其中的兵器;只有当取到至少两件兵器时,方可打开大门撤出。
现在哈利波特任意给你两个密码,请你帮他设计一个程序,算算可以从哪些密室取出兵器,并可否从大门撤出。
输入格式:
第一行输入第一个密码P
第二行输入第二个密码Q
输出格式:
第一行:按从小到大的顺序输出可以打开密室的编号。若没有可以打开的密室,则输出“0”。
第二行:若可打开大门,则输出为“Open”,否则输出“Close”。
输入样例一:
2
5
输出样例一:
0
Close
输入样例二:
7
13
输入样例二:
1 3
Open
题解:
看这题目,许多人想到的是用string模拟,我试过,但没过样例1。
今天,我要介绍一种新的方法:&
(&不是并且的意思,是按位与的意思)
如:
85的二进制是(101 0101)2,51的二进制是(11 0011)2,85&51的运算是这样的:
A 0000 0000 0000 0000 0000 0000 0101 0101
& B 0000 0000 0000 0000 0000 0000 0011 0011
--------------------------------------------
p 0000 0000 0000 0000 0000 0000 0001 0001
可以发现,每一位都进行了与运算,最后得到的结果是(1 0001)2,也是十进制的17。
代码:
#include <bits/stdc++.h>
using namespace std;
int main ()
{
cout<<85&51<<endl;
return 0;
}
那这道题的代码:
#include <bits/stdc++.h>
using namespace std;
int a,b;
bool p;
int main ()
{
cin>>a>>b;
a=a&b;
int i=1;
while (a)
{
if (a%2) cout<<i<<' ',p=true;
a/=2;
i++;
}
if (p) cout<<"\nOpen\n";
else cout<<"0\nClose\n";
return 0;
}