【c语言】输出一组数中有2个出现了1次的数

在之前我们写过了一个函数,写的是在一组数中有一个数只出现了一次,其他书都是出现了2次,这个题思路很简单,直接依次异或就能够找到这个数。详情可以查看我之前的博文。

然后我们来看一下现在这个题。

输出一组数中有2个出现了1次的数。然后其余数出现了2个。

我们这个题的思路大概如下:

1.先异或得到不同数的异或结果

2.找到异或结果中1出现的位数。

3.分组异或,当出现1的位异或,不为1的位异或,可以将原本的数组分为2组,然后依次异或就能够得到2个只出现了一次的数。

大家看看代码就很容易理解了:

#include<stdio.h>

void getNumber(int *arry,int *numOne, int *numSecound,int len)
{
             int i = 0;
             int pivot = 0;
             int pos = 1;
             for(i = 0; i < len; i++)
            {
                        pivot ^= *(arry+i);
            }

             while(!(pivot&1))
            {
                        pivot = pivot>>1;
                        pos++;
            }

             for(i = 0; i<len;i++)
            {
                         if((*(arry+i)>>pos-1) & 1)
                        {
                                    *numOne ^= *(arry+i);
                        }
                         else
                        {
                                    *numSecound ^= *(arry+i);
                        }
            }

}

int main()
{          
             int num1 = 0;
             int num2 = 0;
             int arry[] = {33,19,20,8,37,8,37,5,25,33,19,20};
            getNumber(arry,&num1,&num2, sizeof(arry)/sizeof (arry[0]));
            printf( "%d ",num1);
            printf( "%d",num2);
             return 0;
}
时间: 2024-08-23 15:32:34

【c语言】输出一组数中有2个出现了1次的数的相关文章

【c语言】将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数

// 将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数 #include <stdio.h> // 从原数拿出最低位,放到mid中,mid左移,原数右移 int reverse(int a) { int mid = 0; int bit; int n = 31; for (; n > 0; --n) { bit = a & 1; mid |= bit; mid <<= 1; a >>= 1; } return mid; } int main

【C语言】使用指向指针数据的指针变量,输出一组字符串

//使用指向指针数据的指针变量,输出一组字符串 #include <stdio.h> int main() { char * name[]={"beijing","huanying","nin","!"}; char **p; int i; for(i=0;i<4;i++) { p=name+i; printf("%s ",*p); } printf("\n"); re

FOR循环及基础应用方式(输出一组字符串)

for循环写法: for(起始状态;判断条件;状态改变){ 执行语句; } 运行方式: 1.判断条件 2.执行语句 3.状态改变 for(var i = 0; i < 3; i++) { alert(i); } i=0;     ←起始状态(起始值) 第一轮循环 i<3; alert(0); i=1; 第二轮循环 i<3; alert(1) i=2; 第三轮循环 i<3; alert(2) i=3; 第四轮循环(由于第三轮循环i=3,已经达到i<3这个条件)不成立,无法继续循

给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1(ccf真题)

ccf认证考试2014年9月第一题 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 输出一个整数,表示值正好相差1的数对的个数. 样例输入 6 10 2 6 3 7 8 样例输出 3 样例说明 值正好相差1的数对包括(2, 3), (6, 7), (7, 8). 评测用例规模与约定 1<=n<=1000,给定的整数为不超过10000的非负整数. #include<

输入一组数,找出其中满足某种条件的数(二)

书接上文. 输入一组数,找出其中满足某种条件的数. 短短的一句话,可以衍生出各种场景.今天遇到一道题,输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从大到小输出.分数均为不超过100的非负整数. 我首先想到的是利用哈希表,用空间换时间. 1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int hash[101] = { 0 }; 7 int n = 0; 8 while (cin >>n

C语言打乱一组数字顺序

#include<stdio.h> #include<stdlib.h> #include<math.h> #include<time.h> int main() { int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; int n=16; int i,j,T=1000,tmp; srand(unsigned(time(NULL))); while(T--) { i=rand()%n; j=rand()%n;

螺旋输出一组数组数据的实现

要螺旋输出一组数据,实现的解决方案:采用二维数组的形式来解决 结果如下: 实现如下: 这里我们定义一个类      public class LoopSort{         public static void main(String[] args){                //要螺旋输出的数据的个数             Scanner s=new Scanner(System.in);             System.out.println("请输入螺旋输出的数据的行和列

用c语言统计一个字符串中有多少个数字字符

用c语言统计一个字符串中有多少个数字字符. #include<stdio.h>int main(){    char ch;     int count=0;    while((ch=getchar())!='\n')     {        if(ch>'0'&&ch<'9')              count++;     }     printf("%d\n",count);     return 0; }

C语言输出单个汉字字符

1 #include "stdio.h" 2 #include "windows.h" 3 4 int main() 5 { 6 char sText[20] = { "多字节字符串!OK!" }; 7 DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, sText, -1, NULL, 0); 8 printf("dwNum = %d", dwNum); 9 for (int i = 0