文章

40

粉丝

607

获赞

142

访问

429.3k

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

  1. #include<iostream>
  2. #include<cmath>
  3. #include<string>
  4. using namespace std;
  5. int change(string s){//将字符串转化成数字
  6. int num = 0;
  7. for(int i=0;i<s.size();i++){
  8. num = num * 2 + (s[i]-'0');
  9. }
  10. return num;
  11. }
  12. int main(){
  13. int n;
  14. int num = 0;
  15. string s;
  16. while(cin>>n){
  17. for(int i=0;i<pow(2,n);i++){//用0将每一页都异或一次
  18. num ^= i;
  19. }
  20. for(int j=0;j<pow(2,n)-1;j++){//用全部异或后的值再异或输入的页数,来找出缺的页数
  21. cin >> s;
  22. num ^= change(s);
  23. }
  24. cout << num << endl;//输出
  25. }
  26. return 0;
  27. }

按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:
     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次,故所得的值就是缺页的值!

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发