题目要求
思路
第一种思路呢就是暴力求解。思路就不用多讲,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void find_num(int* a, int num)
{
int i = 0;
int j = 0;
for (i = 0; i < num; i++)
{
int sum = 0;
for (j = 0; j < num; j++)
{
//不与自己比较
if (i != j)
{
//如果相同,则不是我们找的数字
if (((a[i]) ^ (a[j])) == 0)
;
//否则可能是我们要找的数字
else
sum += 1;
}
}
if (sum == num-1)
{
printf("%d ", a[i]);
}
}
}
void input_data(int* a, int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
scanf("%d", &a[i]);
}
}
int main()
{
int a[100] = {0};
int n = 0;
scanf("%d", &n);
input_data(a, n);
find_num(a, n);
return 0;
}
第二种就是应用C语言操作符异或来求得两个单身狗。
首先要知道的是两个相同的数异或得0,假设我们现在有这样的一个数组。
int arr[5]={1,2,3,1,2};
令这个数组从首元素开始遍历异或,1异或2,再异或3,再异或1,再异或2,得出的结果就是3,就能找出这样的一个单身狗。
整个流程如下图所示:
int main()
{
int arr[5] = { 1,2,3,1,2 };
int i = 0;
int dog = 0;
for (i = 0; i < 5; i++)
{
dog ^= arr[i];
}
printf("%d ", dog);
return 0;
}
那么我们就知道在一个数组中找一个单身狗,就是通过异或来获得的,那么有两个单身狗怎么做呢?
假设现在有这么一个数组
int arr[6]={1,2,3,4,1,2};
在对整个数组异或之后可以得出结果是3^4
可以看到3的这个单身狗二进制的最后一位是1,
4的这个单身二进制的最后一位是0,那么我们就可以通过这个二进制位来对这个数组进行分组。
分成这样的两组:
然后再分别在这两个组中找出自己组的单身,例如组1找的单身狗是3,组2找的单身狗是4。所以代码就可以这样写:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[6] = { 1,2,3,4,1,2 };
int ret = 0;
int i = 0;
int dog1 = 0;
int dog2 = 0;
//遍历异或整个数组,得出两个不同数异或的结果
for (i = 0; i < 6; i++)
{
ret ^= arr[i];
}
//确定得出的结果最右边的1的位置
int pos = 0;
for (pos = 0; pos < 32; pos++)
{
if (((ret >> pos) & 1) == 1)
{
break;
}
}
//分组
for (i = 0; i < 6; i++)
{
if (((arr[i] >> pos) & 1) == 1)
{
dog1 ^= arr[i];
}
else
{
dog2 ^= arr[i];
}
}
printf("%d %d ", dog1, dog2);
return 0;
}
这里考察的是异或的运用,以及0异或任何数就得任何数的知识点(个人认为)。
这里的代码呢写得不是很高级,如果觉得写得不好可以提出批评。