第三十六题 UVA1590 IP网络 IP Networks

题目描述:
亚历克斯是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;
}
发布了732 篇原创文章 · 获赞 31 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_35776409/article/details/103963245
IP