题目简述:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
void find_two_dif_num(int ar[], int sz, int *a,int *b)
{
int i = 0;//循环变量
int pos = 0;//位置标记变量
int ret = 0;//异或结果变量
//把所有数字异或
for (i = 0; i < sz; i++)
{
ret ^= ar[i];
}
//找二进制ret中一个为1的位置
for (i = 0; i < 32; i++)
{
if (((ret >> i) & 1 )== 1)
{
pos = i;
break;
}
}
//分组
for (i = 0; i < sz; i++)
{
if (((ar[i] >> pos) & 1) == 1)
{
(*a) ^= ar[i];
}
}
(*b) = (*a) ^ ret;
}
void main()
{
// char a[30] = "-100";
// char *b = "456789";
//int ret = my_atoi(a) + my_atoi(b);
//printf("atoi(a)=%d\n",my_atoi(a));
//printf("atoi(b)=%d\n", my_atoi(b));
//printf("c=%d\n", ret);
//my_strncat(a, b, 3);
//printf("%s\n", a);
//my_strncpy(a, b, 3);
//printf("%s\n", a);
int ar[] = { 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7 };
int sz = sizeof(ar) / sizeof(ar[0]);
int a = 0;
int b = 0;
find_two_dif_num(ar, sz, &a, &b);
printf("a=%d b=%d \n", a, b);
}
运行结果: