HDU4149 Magic Potion(位运算)

题目请戳这里

题意:给出x1,x2,x3,x4,x5,x6,x7,x8与某值m进行异或运算后的结果,再给出x1~x8之和与m进行异或运算后的结果sum,求m.

思路:

根据位运算特性来做,由于m最大为32位,我们可以从最低位依次来推理得到,用x>>i&1来取右数第i-1位的值。

假设二进制右起第一位是1,算出所有xi的右起第一位二进制结果,累加得到tmp,比较tmp与sum的最右位,符合则m最右位为1,否则为0;

于是x1~x8的二进制最右位已求出,累加求进位依次类推。


很有意思的一道题~


code:

/*
*Author : Flint_x 
*Created Time : 2015-07-20 14:19:04 
*File name : whust1_I.cpp 
*/

#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<ctime>
#include<iomanip>
using namespace std;
const double eps(1e-8);
typedef long long lint;

#define cls(a) memset(a,0,sizeof(a))
#define rise(i,a,b) for(int i = a ; i <= b ; i++)
#define fall(i,a,b) for(int i = a ; i >= b ; i--)


int main(){
//    freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
	int T;
	cin >> T;
	rise(t,1,T){
		int r[10];
		rise(i,1,9) cin >> r[i];
		int sum = 0, m = 0;
		rise(i,0,31){
			int tmp = 0;
			rise(j,1,8){
				tmp += r[j]>>i&1;
			}
			if((sum + tmp)% 2 != (r[9]>>i&1)){//x>>i&1等效于1<<i&x 
				tmp = 8 - tmp;
				sum = (sum + tmp) / 2;
				m += 1<<i;
			}
			else sum = (sum + tmp) / 2;
		}
		cout << m << endl;
	}
    return 0;
}


     


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值