在一个数组中,只有2个数出现过一次,其余的都出现过两次
思想
将数组所有数异或在一起(异或,二进制位,相同位0相异为1)求出这两个数的和
然后在找出他二进制位为1 在第几位,我就把它叫做js
降第js位为1 的异或一起
降第js位为0 的异或一起
就可以求出,这两个数了
第一步 :将数组所有数异或在一起(异或,二进制位,相同位0相异为1)求出这两个数的和
int arr[] = { 1,2,3,4,5,6,8,64,6,5,4,3,2,1 };
//第一步,先都异或,因为相同数为0,求出只出现过一次的数的和
int num = 0;
int i;
int js = 1;//计数器
for (i = 0; i < 14; ++i)
{
num ^= arr[i];
}
第二部:然后在找出他二进制位为1 在第几位,我就把它叫做js
while (1)
{
if (num % 2 == 0&&num)//num不能是0
{
num /= 2;
++js;
}
else
break;
}
printf("%d\n", js);
第三部
我是先算出,2js的次方,
然后在除,如果小于或等于0,就说明这个数js为是0
降第js位为1 的异或一起
降第js位为0 的异或一起
js = pow(js, 2);
int y1 = 0;//异或js为1
int y2 = 0;//异或js 位为0
for (i = 0; i < 14; i++)
{
if (arr[i]/js<=0)
{
y1 ^= arr[i];
}
else
y2 ^= arr[i];
}
printf("%d %d", y1, y2);
上一下完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<math.h>
//题目在一组数组中,只有2个数出现过一次,其他数出现过两次。找出出现过一次的数
int main() {
int arr[] = { 1,2,3,4,5,6,8,64,6,5,4,3,2,1 };
//第一步,先都异或,因为相同数为0,求出只出现过一次的数的和
int num = 0;
int i;
int js = 1;//计数器
for (i = 0; i < 14; ++i)
{
num ^= arr[i];
}
printf("%d\n", num);
//找出这个数二进制位第几位为1
//如果%2==1就说明在这个位,不是就把它的二进制位想右移。等最右面的二进制位位1,%2就不等于0 ,就找到他在第几位二进制位一
while (1)
{
if (num % 2 == 0&&num)//num不能是0
{
num /= 2;
++js;
}
else
break;
}
printf("%d\n", js);
//找到,降数组分成2组js位为1的一组,js位0的一组
js = pow(js, 2);
int y1 = 0;//异或js为1
int y2 = 0;//异或js 位为0
for (i = 0; i < 14; i++)
{
if (arr[i]/js<=0)
{
y1 ^= arr[i];
}
else
y2 ^= arr[i];
}
printf("%d %d", y1, y2);
return 0;
}
感谢观看