文章

40

粉丝

607

获赞

68

访问

401.8k

头像
1118 将军的书
P1118
发布于2020年3月27日 22:48
阅读数 11.7k

#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次,故所得的值就是缺页的值!

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发