#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
//compare函数返回两个不超过255的整数前多少二进制位相等
int compare(int a,int b)
{
a^=b;
a^=255;
int i;
for(i=0;i<=7;i++){
if(a/(1<<i)==(1<<(8-i))-1){
break;
}
}
return 8-i;
}
int main()
{
//freopen("input.txt","r",stdin);
int m,x[4],i,j,count;
int mask[4],subnet[4];
char ch;
while(cin>>m){
memset(mask,0,sizeof(mask));
memset(subnet,0,sizeof(subnet));
int a[m][4];
for(i=0;i<m;i++){
cin>>a[i][0]>>ch>>a[i][1]>>ch>>a[i][2]>>ch>>a[i][3];
}
for(i=0;i<4;i++)
x[i]=a[0][i];
//各位数字按位与
for(i=0;i<m;i++){
for(j=0;j<4;j++){
x[j]&=a[i][j];
}
}
for(i=0;i<4;i++){
count=8;
//判断共同前缀位数
for(j=0;j<m;j++){
if(compare(x[i],a[j][i])<count)
count=compare(x[i],a[j][i]);
}
if(count==8){
mask[i]=255;
subnet[i]=x[i];
}
else{
mask[i]=256-(1<<(8-count));
subnet[i]=mask[i]&x[i];
break;
}
}
for(i=0;i<4;i++){
cout<<subnet[i];
if(i!=3)
cout<<'.';
}
cout<<endl;
for(i=0;i<4;i++){
cout<<mask[i];
if(i!=3)
cout<<'.';
}
cout<<endl;
}
return 0;
}
UVA - 1590 IP Networks
最新推荐文章于 2017-06-09 19:23:27 发布