题意:给出n个同属一个网络的IP地址,求其子网掩码以及网络地址。

题解:只需知道子网掩码与ip地址按位与后等于同一个值,且子网掩码前面全是1,后面全是0即可。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 struct IP
 6 {
 7     int b[4];
 8 }po[1005];
 9 int lowbit(int x)
10 {
11     return x&(-x);
12 }
13 int lg(int x)
14 {
15     int pos=0;
16     while(x)
17     {
18         x>>=1;
19         pos++;
20     }
21     return pos;
22 }
23 int main()
24 {
25     int n;
26     while(scanf("%d",&n)!=EOF)
27     {
28         for(int i=0;i<n;i++)
29             scanf("%d.%d.%d.%d",&po[i].b[0],&po[i].b[1],&po[i].b[2],&po[i].b[3]);
30         IP masks,network;
31         int tp[4];
32         for(int i=0;i<4;i++)
33             tp[i]=po[0].b[i],masks.b[i]=255;
34         for(int i=1;i<n;i++)
35             for(int j=0;j<4;j++)
36                 tp[j]&=po[i].b[j];
37         for(int i=0;i<4;i++)
38             network.b[i]=tp[i];
39         int last=0;
40         for(int i=0;i<n;i++)
41         {
42             for(int j=0;j<4;j++)
43             {
44                 int k,pos=0;
45                 if(k=(tp[j]^po[i].b[j]))
46                 {
47                     while(k)
48                     {
49                         pos=lowbit(k);
50                         k-=pos;
51                     }
52                     last=max(last,lg(pos)+(3-j)*8);
53                 }
54             }
55         }
56         if(last>24)
57         {
58             masks.b[0]&=~((1<<(last-24))-1);
59             masks.b[1]=masks.b[2]=masks.b[3]=0;
60         }
61         else if(last>16)
62         {
63             masks.b[1]&=~((1<<(last-16))-1);
64             masks.b[2]=masks.b[3]=0;
65         }
66         else if(last>8)
67         {
68             masks.b[2]&=~((1<<(last-8))-1);
69             masks.b[3]=0;
70         }
71         else if(last>0)
72         {
73             masks.b[3]&=~((1<<last)-1);
74         }
75         for(int i=0;i<4;i++)
76             network.b[i]&=masks.b[i];
77         printf("%d.%d.%d.%d\n",network.b[0],network.b[1],network.b[2],network.b[3]);
78         printf("%d.%d.%d.%d\n",masks.b[0],masks.b[1],masks.b[2],masks.b[3]);
79     }
80     return 0;
81 }