UVA 1590 IP Networks

本文最后更新于 2022年2月5日 晚上

Description:

给你一些IP地址如:192.168.2.101,求出这些IP地址的子网掩码和这个网络最小的IP地址(可能描述不太准确)。

样例:
input:

1
2
3
4
3
194.85.160.177
194.85.160.183
194.85.160.178

output:
1
2
194.85.160.176
255.255.255.248

分析:
这些IP的前三位相同,不需要考虑,直接看第4位,写出他们的二进制:
176(10): 1011 0001
183(10): 1011 0111
178(10): 1011 0010

子网掩码就是掩盖相同的位,显示不同的位,故子网掩码的最后一位是 1111 1000,即248
最小的IP即满足相同位相同,而不同位最小的原则,最后一位是:1011 0000,即176

Solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<bits/stdc++.h>
using namespace std;

int a[1000][4];
int n;

int main() {
while(cin>>n) {
for(int i=0; i<n; i++)
scanf("%d.%d.%d.%d", &a[i][0], &a[i][1], &a[i][2], &a[i][3]);
int num, pos = -1;
for(int i=0; i<4; i++) {
int flag = 1;
num = i;
for(int j=7; j>=0; j--) {
int tmp = (1<<j)&a[0][i];
for(int k=1; k<n; k++) {
if(tmp!=((1<<j)&a[k][i])) { //取每一段的第j位的二进制
flag = 0;
pos = j;
break;
}
}
if(!flag)
break;
}
if(!flag)
break;
}
int cnt1 = 0, cnt2 = 0;
for(int i=7; i>pos; i--) {
cnt1+= ((1<<i)&a[0][num]);
cnt2+= (1<<i);
}

if(num == 3)
printf("%d.%d.%d.%d\n255.255.255.%d\n",a[0][0],a[0][1],a[0][2], cnt1, cnt2);
else if(num==2) {
printf("%d.%d.%d.0\n255.255.%d.0\n", a[0][0],a[0][1],cnt1,cnt2);
} else if(num==1) {
printf("%d.%d.0.0\n255.%d.0.0\n",a[0][0],cnt1, cnt2);
} else
printf("%d.0.0.0\n%d.0.0.0\n",cnt1,cnt2);
}
}


UVA 1590 IP Networks
https://nanami.run/2021/02/04/uva-1590-ip-networks/
作者
Nanami
发布于
2021年2月4日
许可协议