题意:给出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 }