环 境: Windows 8,Visual Studio 2013
语 言: C语言
实验要求: 给定一个偶数个数的数组,其中有两个数只出现了一次,请通过C语言代码,让计算机帮你实现该功能
代码展示:
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <assert.h>
#pragma warning(disable:4996)
int find_single_data(int arr[], int len, int *data1, int *data2)
{
assert(arr);//判空
assert(len > 0);//合法性判断
assert(data1);//指针合法性
assert(data2);//指针合法性
int tmp = arr[0];//中间变量,保护arr[0]
int i = 1;//循环变量
while (i < len)//循环条件
{
tmp ^= arr[i++];//tmp=tmp^arr[i++],与arr[0]相同的,32位比特位全为0,异或下来相同的数,尾数相同
}
int flag = 1;//32位比特位最后一位是1,其余全为0
while (1){
if (tmp & flag){//第一个为1的比特位为真
break;//为1跳出
}
else{
flag <<= 1;//flag=flag<<1(32位比特位左移1位操作
}
}
*data1 = 0;
*data2 = 0;
for (i = 0; i < len; i++){
if (arr[i] & flag){
//A
*data1 ^= arr[i];
}
else{
//B
*data2 ^= arr[i];
}
}
return 0;
}
int main()
{
int data1;
int data2;
int arr[] = { 23, 23,45, 45, 1, 2 };
find_single_data(arr, sizeof(arr) / sizeof(arr[0]), &data1, &data2);
printf(" %d, %d\n", data1, data2);
system("pause");
return 0;
}