码迷,mamicode.com
首页 > 其他好文 > 详细

HDU4149 Magic Potion(位运算)

时间:2015-07-20 23:47:11      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:位运算   c语言   acm   数论   

题目请戳这里

题意:给出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;
}


     


版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU4149 Magic Potion(位运算)

标签:位运算   c语言   acm   数论   

原文地址:http://blog.csdn.net/qq_15714857/article/details/46972373

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!