程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> HDU4149 Magic Potion(位運算)

HDU4149 Magic Potion(位運算)

編輯:關於C++

 

題意:給出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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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<

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved