8 2 4 3 6 3 2 5 5
4 6思路:
代码:
/* 数组中只出现一次的数字 by Rowandjj 2014/8/14 */ #include<stdio.h> #include<stdlib.h> /** *找到数字xorVal的二进制中第一个值为1的位 * */ int FirstBitIs1(int xorVal) { int index = 0; while(((xorVal&1)==0) && (index < 8*sizeof(int)))//不能越界,注意运算符优先级,多加几个括号 { index++; xorVal = xorVal>>1; } return index; } /** *判断data中第index位(二进制)是否为1 */ bool isBit1(int data,int index) { data = data>>index; return data&1; } /** * data 目标数组 * len 数组长度 * num1 一个只出现一次的数字 * num2 另一个只出现一次的数字 */ bool FindNumberAppearOnce(int data[],int len,int *num1,int *num2) { if(data == NULL || len < 2) { return false; } int i; int xorVal = 0; for(i = 0; i < len; i++) { xorVal ^= data[i]; } int indexOf1 = FirstBitIs1(xorVal); *num1 = *num2 = 0;//一定要赋值为0 for(i = 0; i < len; i++) { if(isBit1(data[i],indexOf1)) { *num1 ^= data[i]; }else { *num2 ^= data[i]; } } return true; } int main() { int n; while(scanf("%d",&n) != EOF) { if(n <= 1) { continue; } int *arr = (int*)malloc(sizeof(int)*n); if(!arr) { exit(-1); } int i; for(i = 0; i < n; i++) { scanf("%d",arr+i); } int num1,num2; if(FindNumberAppearOnce(arr,n,&num1,&num2)) { if(num1 < num2) { printf("%d %d\n",num1,num2); }else { printf("%d %d\n",num2,num1); } } free(arr); } return 0; }
/* 数组中只出现一次的数字 */ #include<stdio.h> #include<stdlib.h> bool FindFirstAppearOnceNum(int data[],int len,int *num1,int *num2) { if(data == NULL || len <= 1) { return false; } int i; int xorVal = 0; for(i = 0; i < len; i++) { xorVal ^= data[i]; } *num1 = *num2 = 0;//一定要赋值为0 int temp = xorVal & (-xorVal);//结果:xorVal中最右边的1被保留其他位为0 for(i = 0; i < len; i++)//遍历数组,将数组分成两部分,每一部分只有一个数字出现一次 { if(data[i] & temp)//temp中某一位为1,其他位为0,再与上data[i]就可以将两个只出现一次的数字分开 { *num1 ^= data[i]; }else { *num2 ^= data[i]; } } return true; } int main() { int n; while(scanf("%d",&n) != EOF) { if(n <= 1) { continue; } int *arr = (int*)malloc(sizeof(int)*n); if(!arr) { exit(-1); } int i; for(i = 0; i < n; i++) { scanf("%d",arr+i); } int num1,num2; if(FindFirstAppearOnceNum(arr,n,&num1,&num2)) { if(num1 < num2) { printf("%d %d\n",num1,num2); }else { printf("%d %d\n",num2,num1); } } free(arr); } return 0; }
原文地址:http://blog.csdn.net/chdjj/article/details/38554947