奇數個的那個數(異或問題)

2021-07-02 15:14:32 字數 1106 閱讀 8128



給定些數字,這些數中只有乙個數出現了奇數次,找出這個數。

每組資料第一行n表示數字個數,1 <= n <= 2 ^ 18 且 n % 2 == 1。

接下來n行每行乙個32位有符號整數。

出現奇數次那個數,每組資料對應一行。

511

2237

1212

233

3

2

**

#include

#include

int main()

printf("%d\n", v);

}return 0;

}本體用暴力求解的話,在oj系統上一定會超時,所以這裡採用異或的演算法

異或,英文為exclusive or,或縮寫成xor

異或(xor)是乙個數**算符。它應用於邏輯運算。異或的數學符號為「⊕」,計算機符號為「xor」。其運算法則為:

a⊕b = (¬a ∧ b) ∨ (a ∧¬b)

如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。

異或也叫半加運算,其運算法則相當於不帶進製的二進位制加法:二進位制下用1表示真,0表示假,則異或的運算法則為:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同為0,異為1),這些法則與加法是相同的,只是不帶進製。

異或略稱為xor、eor、ex-or

程式中有三種演算子:xor、xor、⊕。

使用方法如下

z = x ⊕ y

z = x xor y

這裡是百科上的定義,

下面是我找到解釋:

1、a xor a = 0,也就是說異或同乙個數偶數次,結果不變。

2、異或運算滿足交換律。

這樣我們只需要按順序把所有的數依次異或一遍,剩下的就是唯一出現奇數次的那個數了。更複雜的乙個問題是有2個數字出現奇數次,這樣異或一遍會得到那2個數異或的結果,找出2個數二進位制中不同的一位,然後把所有這n個數按照在那一位是0還是1分成兩類,然後對每一類分別使用前乙個問題的演算法即可。

原部落格中給出的程式事先將所有的數存在乙個大陣列中,然後在利用迴圈異或,這在oj系統上會造成記憶體不足的情況,這裡我在scanf數字變異或,解決了記憶體的限制,

哈哈哈哈哈哈哈哈

CSU 1217 奇數個的那個數(異或)

time limit 2 sec memory limit 1 mb submit 523 solved 120 submit status web board 給定些數字,這些數中只有乙個數出現了奇數次,找出這個數。每組資料第一行n表示數字個數,1 n 2 18 且 n 2 1。接下來n行每行乙個...

1217 奇數個的那個數

time limit 2 sec memory limit 128 mb submitted 1276 solved 382 給定些數字,這些數中只有乙個數出現了奇數次,找出這個數。每組資料第一行n表示數字個數,1 n 2 18 且 n 2 1。接下來n行每行乙個32位有符號整數。出現奇數次那個數,...

異或運算及其應用 查詢奇數個數的數字

異或運算功能很強大。用的得當可以提高演算法效率。先說一下異或運算的運算法則 1.a b b a 2.a b c a b c a b c 3.d a b c 可以推出 a d b c 4.a b a b 對於性質1,不多說,顯而易見的。對於性質2和4,這裡最近我發現了乙個重要的應用,就是可以查詢出一組...