文章
40
粉丝
607
获赞
70
访问
424.6k
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int change(string s){//将字符串转化成数字
int num = 0;
for(int i=0;i<s.size();i++){
num = num * 2 + (s[i]-'0');
}
return num;
}
int main(){
int n;
int num = 0;
string s;
while(cin>>n){
for(int i=0;i<pow(2,n);i++){//用0将每一页都异或一次
num ^= i;
}
for(int j=0;j<pow(2,n)-1;j++){//用全部异或后的值再异或输入的页数,来找出缺的页数
cin >> s;
num ^= change(s);
}
cout << num << endl;//输出
}
return 0;
}
按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:
0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
即相应位的值:相同的结果为 0,不相同的结果为 1。
若书有4页,分别是0页、1页、2页、3页,对应的二进制为00,01,10,11;
此时将全部页数的二进制与00异或得到 00^00^01^10^11 = 00;此值记为num;
此时若缺页为2,即二进制值为10的页数缺失,将没有缺失的页数的二进制值与num异或,即:00^00^01^11 = 10.此时就找出所缺的页数!
原理就是若一个数x与0异或一次值还是x本身,若一个数x与0异或两次还是0;在题目中除了缺的页数外所有页数全部与0异或两次,只有缺的页数异或1次,故所得的值就是缺页的值!
登录后发布评论
暂无评论,来抢沙发