王道训练营3月8日

移位操作

右移--补符号位

左移--全部补0

右移一位相当于除以二并取整

左移以为相当于乘以二

 

端存储

 

http://blog.csdn.net/favory/article/details/4441361

 

101个数,50个出现了2次,1个出现了1次,求出此数。

 1 /*103个数字,50个出现了2次,3个出现了1次,求这三个数*/
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #define isON(n, i) ((n) & 1 << (i))
 6 
 7 void findTheSingleNumber(int *arr,int size);
 8 int main(int argc,char* argv[])
 9 {
10     int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,111,1,2,3,4,555,5,6,7,8,9,10,333,11,12,13};
11     int k = sizeof(a)/sizeof(int);
12     findTheSingleNumber(a,k);
13     return 0;
14 }
15 
16 void getnum(int a[],int length);
17 void findTheSingleNumber(int *arr,int size)
18 {
19     int tempA = 0;
20     int tempB = 0;
21     int countA = 0;
22     int countB = 0;
23     int b[size+1];
24     int i=0;
25     int j=0;
26     int k=0;
27 
28     for(i=0;i<32;i++)                      //int 只有32位
29     {
30         for(j=0;j<size;j++)
31         {
32             if(isON(arr[j],i))                //检验arr[j] 的第i位是否为1;
33             {
34                 tempA ^= arr[j];
35                 countA++;
36             }
37             else {
38                 tempB ^= arr[j];
39                 countB++;
40             }
41         }
42         if(countA%2==1)
43         {
44             if(tempB==0)                       //三个都在countA中
45                 continue;                      //换int类型整数的另一位继续分2组求解
46             else {                            //countA中只有一个 tempA即为所求
47                 for(i=0;i<size;i++)
48                 {
49                     b[k++] = arr[i];
50                 }
51                 b[k] = tempA;
52                 getnum(b,k+1);
53                 printf("%d   ",tempA);
54                 break;
55             }
56         }
57         else {
58             if(tempA==0)                      //三个都在countB中
59                 continue;
60             else {
61                 for(i=0;i<size;i++)
62                 {
63                     b[k++] = arr[i];
64                 }
65                 b[k] = tempB;
66                 getnum(b,k+1);
67                 printf("%d   ",tempB);           //countB中只有一个 tempB即为所求
68                 break;
69             }
70         }
71     }
72 }
73 
74 void getnum(int a[],int length)
75 {
76     int s = 0;
77     int i;
78     for(i=0;i<length;i++)
79     {
80         s = s^a[i];
81     }
82     int temp1 = s;
83     int temp2 = s;
84     int k=0;
85     while((temp1&1)==0)
86     {
87         temp1 = temp1>>1;
88         k++;
89     }
90     for(i=0;i<length;i++)
91     {
92         if((a[i] >> k)&1)
93         {
94             s = s^a[i];
95         }
96     }
97     printf("%d   %d    ",s,s^temp2);
98 }

 

posted @ 2015-03-08 16:16  千阳adam  阅读(145)  评论(0编辑  收藏  举报