C语言查找数组中只出现一次的两个数字,其余数字均出现两次

本文介绍了一种使用C语言实现的算法,通过异或运算在数组中找到仅出现一次的两个数字。该算法首先计算所有元素的异或结果,然后找出结果中第一个为1的位数,以此为依据将数组分为两组并分别进行异或操作,最终找出那两个唯一的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
void Check(int arr[], int len){
	int i = 0;
	int tmp = 0;
	int k = 0;
	int s = 0;
	//两个只出现一次数字的异或的结果tmp
	for (i = 0; i < len; i++){
		tmp = tmp^arr[i];
	}
	//找出异或结果的第一个为1的位数count
	int count = 0;
	for (i =31; i >= 0; i--){
		if((tmp >> i) &1){
			count = i;
		}
	}
	//将数组分成两个子数组,每个数组只有一个出现一次的数字
	for (i = 0; i < len; i++){
		if ((arr[i] >> count )& 1){
			k = k^arr[i];
		}
		else{
			s = s^arr[i];
		}
	}
	//分别对两个数组采用异或操作找出只出现一次的数字打印
	printf("%d\n", k);
	printf("%d\n", s);

}
int main(){
	int arr[] = { 1, 2, 3, 4, 5, 1, 2, 3 };
	int len = sizeof(arr) / sizeof(arr[0]);
	Check(arr,len);
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值