文章
40
粉丝
607
获赞
142
访问
429.3k
- #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次,故所得的值就是缺页的值!
登录后发布评论
暂无评论,来抢沙发