码迷,mamicode.com
首页 > 编程语言 > 详细

其他数出现两次的数组中两个只出现一次数

时间:2016-01-06 11:33:41      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

#include <stdio.h>
#include <stdlib.h>

/*
	有102个整数,
	其中有50个数出现了两次,
	2个数出现了一次, 
	找出出现了一次的那2个数。
*/

/*
	思路:
	所有数异或得到两个单独数a,b的异或值c,
	指出c为1的某位。
	根据pos位为1或者为0将数组划分为两个组,
	再分别对这两个组进行异或,
	即可得到:a,b。
*/

/*
	注:结构体要放在函数声明前
*/

typedef struct
{
	int num1;
	int num2;
}TwoNumber;

int isOdd(int num);
int getOne(int *arr, int length);
int getPos(int number); 
TwoNumber getTwoNumber(int *arr, int length);


int main(){
	int length = 0;	//整数个数
	scanf("%d", &length);
	if (isOdd(length))	//判断是否是偶数
		printf("Please input an even number.\n");
	else{
		int * numbers = (int*)malloc(length * sizeof(int));	//存储这length个整数
		printf("Please input %d number: \n", length);
		int tmp;
		for (int i = 0; i < length; ++i){
			scanf("%d", &tmp);
			numbers[i] = tmp;
		}
		TwoNumber tnumber = getTwoNumber(numbers, length);
		printf("%d\n", tnumber.num1);
		printf("%d\n", tnumber.num2);
	}
	system("pause");
	return 0;
}

TwoNumber getTwoNumber(int *arr, int length){
	int number = 0;	//两个单独数的异或值
	for (int i = 0; i < length; ++i)
		number ^= arr[i];
	int pos = getPos(number);
	int num_1 = 0;	//第一组数的异或值
	int num_2 = 0;	//第二组数的异或值
	for (int i = 0; i < length; ++i){
		int tmp = arr[i] >> pos;
		if ((tmp&‘\x01‘) == 0)
			num_1 ^= arr[i];
		else
			num_2 ^= arr[i];
	}
	TwoNumber tNumber;
	tNumber.num1 = num_1;
	tNumber.num2 = num_2;
	return tNumber;
}

int isOdd(int num){
	if (num % 2 == 0)
		return 0;
	else
		return 1;
}

int getOne(int *arr, int length){
	int num = 0;
	for (int i = 0; i < length; ++i)
		num ^= arr[i];
	return num;
}

int getPos(int number){	//某个不为0的数,二进制中第一个1的位置
	int pos = 0;
	while ((number&‘\x01‘) == 0){
		pos++;
		number >>= 1;
	}
	return pos;
}

  

其他数出现两次的数组中两个只出现一次数

标签:

原文地址:http://www.cnblogs.com/mutaohengheng/p/5104743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!