給定些數字,這些數中只有乙個數出現了奇數次,找出這個數。
每組資料第一行n表示數字個數,1 <= n <= 2 ^ 18 且 n % 2 == 1。
接下來n行每行乙個32位有符號整數。
出現奇數次那個數,每組資料對應一行。
5112237
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,這裡最近我發現了乙個重要的應用,就是可以查詢出一組...