福州网站建设方案开发,谁有手机可以上的网站,莱芜房产网新房,拱墅区做网站文章目录 一、题目二、思路三、代码实现 提示#xff1a;以下是本篇文章正文内容#xff0c;下面案例可供参考
一、题目 二、思路
第一步
在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况#xff0c;而本道题是出现两个单身狗的情况。根据一个数… 文章目录 一、题目二、思路三、代码实现 提示以下是本篇文章正文内容下面案例可供参考
一、题目 二、思路
第一步
在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况而本道题是出现两个单身狗的情况。根据一个数异或上0等于数本身一个数异或数本身等于0。我们可以知道题目中的所有数异或之后会得到5和6的异或结果。也就是如下图 第二步
在第一步的过程中我们得到两个数5和6的异或结果0011根据上图我们可以知道当两个数出现二进制位不同的时候他们的异或结果为1既然两个数异或结果是两个数的二进制位不同的结果那我们可以判断5和6的出现二进制位不同的地方也就是出现1的地方然后我们根据二进制位出现1的地方将一堆数分成两个部分这样不就将两个单身狗进行分开来了么。 第三步
在第二步我们已经将所有的数分成两堆那么接下来只要将两堆数分别异或不就得到了两个单身狗数嘛。 三、代码实现
void findnum(int arr[], int sz, int* pnum1, int* pnum2)
{//得到所有数的异或结果int i 0;int sum 0;for (i 0; i sz; i){sum ^ arr[i];}//判断位数不同的那位int flag 0;for (i 0; i 32; i){if ((sum i) 1) //按位与两个都为1才为1找到是1的位置按位异或是1的位置的位肯定不同{flag i;break;}}//分成两组*pnum1 *pnum2 0; //这里设置为0是防止传进来的两个数不是0for (i 0; i sz; i){if ((arr[i] flag) 1){*pnum1 ^ arr[i]; //这里将标志位地方二进制为1的那一堆数异或起来}else{*pnum2 ^ arr[i]; //这里将标志位地方二进制为0的那一堆数异或起来}}
}
int main()
{int arr[] { 1,2,3,4,5,1,2,3,4,6 };int sz sizeof(arr) / sizeof(arr[0]);int pnum1 0;int pnum2 0;findnum(arr, sz, pnum1, pnum2);printf(%d %d,pnum1,pnum2);return 0;
}