1. 程式人生 > >N個整數 兩兩異或求和

N個整數 兩兩異或求和

問題:有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;
}
題目不難,就是練得太少,對於題目思考的不夠完善徹底,這需要經常積累知識和經驗。