c語言 尋找一個由成對元素組成的陣列中的不成對元素
阿新 • • 發佈:2018-11-05
在一個數組中有很多對的元素,相互成對出現,而有2個元素則是不成對出現,要找到這兩個元素,並將其列印在螢幕上,需要用到位運算和運算子的應用。
例如{1,2,3,1,2,3,5,8},這一組元素中, 5 , 8 這兩個元素不是成對出現的,我們的目的就是找出這兩個元素。整個思路就是先進性陣列中所有元素的異或運算,然後將所得的數 &1,找出異或後出現 1 的那一位,這時,i 的值因為如果就是該位的位數,然後在進行兩個元素的分離(如果兩個元素不同,則至少有一位兩者不同,而兩者不同時肯定是一個為1,一個為0),找出兩個不同的數,最後再將兩個元素的地址分別賦給另外兩個提前準備好的地址中去,由內部函式變數值的地址的改變來改變外部函式變數的值,從而找出這兩個元素。
#include<stdio.h> void* diff(int* arr,int as,int *px, int *py) { int i = 0; int j = 0; int num = 0; for (i = 0; i < as; i++) { num ^=arr[i]; } for (i = 0; i < 32; i++) { if (((num >> i) & 1) == 1) { j = i; break; } } for (i = 0; i < as; i++) { if (((arr[i] >> j) & 1) == 1) { *px ^= arr[i]; } else { *py ^= arr[i]; } } } int main() { int arr[] = { 1, 2, 3, 5, 1, 2, 3,8}; int sz = sizeof(arr) / sizeof(arr[0]); int a = 0; int b = 0; diff(arr, sz, &a, &b); printf("%d %d", a, b); system("pause"); return 0; }