题目描述:
亚历克斯是IP网络的管理员。他的客户每个人有一组单独的IP地址,他决定将所有IP地址分组到最小可能的IP网络中。
每个IP地址有四个部分组成,每个部分用小数点分离。格式如a,b,c,d每个部分都是一个十进制的数(0≤这个数≤255)且没有多余的前导零。
IP网络由两个4各部分的数字——网络地址和网络掩码组成。网络地址和网络掩码和IP地址写入方式相同。为了理解网络地址和网络掩码的含义,我们将它们用二进制来表述。IP地址、网络地址和网络掩码的二进制都由32位组成:a的8位(从最重要到最不重要),其次是b的8位,其次是c的8位,其次是d的8位。
IP网络包含一个2n个IP地址的范围,其中所有n>32。网络掩码始终存在32~n个第一部分设置为一,n个最后部分在二进制表示中设置为零。网络地址已任意32个n个第一部分,n个最后部分在其二进制表示中设置为零。IP网络所有的32个n位第一位相当于32位n个任意位的网络地址的所有IP地址最后一位。
我们说,一个IP网络比其他IP网络更小,那么它包含更少的IP地址。
输入输出格式
输入格式:
有多个测试数据。
输入文件的第一行包含一个整数m。下面m行都是一个IP地址。IP地址可能重复。
输出格式:
每个测试数据在第一行写上网络地址,在第二行写上网络掩码。 网络地址和网络掩码代表的IP网络包括所有IP地址且最小。
样例输入输出:
样例输入#1
3
194.85.160.177
194.85.160.183
194.85.160.178
样例输出#1
194.85.160.176
255.255.255.248
样例说明
一个IP网络的网络地址是194.85.160.176它的网络掩码是255.255.255.248
那么这个IP网络包含8个IP地址从194.85.160.176到194.85.160.183
说明
0 ≤ n ≤ 32,1 ≤ m ≤ 1000
感谢@BIGmrsrz 提供翻译
输入输出样例
无
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int mask[] = {255, 254, 252, 248, 240, 224, 192, 128, 0};
int ip[4][1024];
int main(int argc,char* argv[]) {
int m;
while(scanf("%d",&m) != EOF) {
for(int i=0; i<m; i++)
scanf("%d.%d.%d.%d",&ip[0][i],&ip[1][i],&ip[2][i],&ip[3][i]);
int ams[4],minip[4];
for(int i=0; i<4; i++) {
sort(ip[i],ip[i] + m);
int Max = ip[i][m - 1];
int Min = ip[i][0];
int dif = 0;
for(int j=1; j<=8; j++){
if(Min % 2 != Max % 2) {
dif = j;
}
Min /= 2; Max /= 2;
}
ams[i] = mask[dif];
}
for(int i=0; i<4; i++) {
if(ams[i] != 255) {
for(int j=i+1; j<4; j++)
ams[j] = 0;
break;
}
}
for(int i=0; i<4; i++)
minip[i] = ip[i][0] & ams[i];
printf("%d.%d.%d.%d\n",minip[0],minip[1],minip[2],minip[3]);
printf("%d.%d.%d.%d\n",ams[0],ams[1],ams[2],ams[3]);
}
return 0;
}