【C语言编程】一个整形数组里除了两个数字之外,其他数字都出现了两次,找出这两个数字

题目:
一个整形数组里除了两个数字之外,其他数字都出现了两次,请写程序找出这两个只出现一次的数字,例如数组为{1,3,5,7,1,3,5,9},找出7和9

思路:
(1)先遍历并按位与之后得到的是这个数组中出现一次的两个数按位与的结果
(2)在这个结果中找到2进制的1,并且记录下产生不同1的位置
(3)将数字按照上面记录的不同位置分成两类,再分别再不同类中与0按位与

源码:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于第一个问题,你可以使用结构体类型转换实现。在C语言中,我们可以使用结构体类型来表示一个字节的字。例如: ```c typedef struct { unsigned char low; unsigned char high; } Word; ``` 这个结构体中包含了两个无符号字符型变量,分别表示一个字的低字节和高字节。那么对于一个数组中的元素,如果它的类型是 unsigned short,我们可以将它的地址强制转换为一个 Word 类型的指针,然后通过指针访问它的低字节和高字节。示例代码如下: ```c unsigned short num = 0xABCD; Word* word = (Word*)&num; unsigned char low = word->low; unsigned char high = word->high; ``` 对于第二个问题,我们可以使用异或运算的性质来解决。如果一个数字出现两次,那么对它进行异或运算两次得到的结果是 0。因此,我们可以对数组中的所有元素进行异或运算,最终得到的结果就是两个不同的数字的异或结果。然后我们可以根据这个结果来将数组中的元素分为组,每一组中都包含一个不同的数字。然后再对每一组中的元素分别进行异或运算,就可以得到这两个数字了。示例代码如下: ```c void findTwoNumbers(int* nums, int size, int* num1, int* num2) { int xorResult = 0; for (int i = 0; i < size; i++) { xorResult ^= nums[i]; } int bitIndex = 0; while ((xorResult & (1 << bitIndex)) == 0) { bitIndex++; } int group1 = 0, group2 = 0; for (int i = 0; i < size; i++) { if ((nums[i] & (1 << bitIndex)) == 0) { group1 ^= nums[i]; } else { group2 ^= nums[i]; } } *num1 = group1; *num2 = group2; } ``` 这个函接受一个 int 类型的数组数组中除了两个数字之外,其他的数字出现两次。函通过异或运算来找到这两个数字,并将它们分别存储在 num1 和 num2 参中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值