N個整數 兩兩異或求和
阿新 • • 發佈:2019-01-06
問題:有n個正整數,將每個整數兩兩異或,求出最後所有異或結果的和。n <= 1000000 , 給出的正整數 <= 1000000.
才疏學淺,參考了別人的思路。
將每個整數按位來考慮。重點記錄每一位的異或後1的個數。要注意結果的範圍。
題目不難,就是練得太少,對於題目思考的不夠完善徹底,這需要經常積累知識和經驗。#include <iostream> #include <cstring> using namespace std; //每個整數最多不會超過20位 #define K 20 int main() { int n,x; int c[K]; while( cin >> n ) { memset( c , 0 , sizeof(c) ); for( int i = 0 ; i < n ; i++ ) { cin >> x; for( int j = 0 ; j < K ; j++ ) { if( x & (1 << j) )//記錄每一位 1 的個數 c[j]++; } } long long res = 0; for( int i = 0 ; i < K ; i++ ) { res += (long long)( n - c[i] ) * c[i] * ( 1 << i );//異或後在第i+1位有 (n-c[i])*c[i] 個 1 } cout << res << endl; } return 0; }