UVa 1590 - IP Networks(进制转换+细节处理)

输入n个IP地址,求满足该地址的最小网络地址和子网掩码。

我是进制转换之后做的,貌似直接用位运算也可以。转换之后依次对比,主要考察的还是细节的处理,循环时数组一定要清空。

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1010
#define maxm 40
using namespace std;
char str[maxn][maxm],ip2[maxn],mask2[maxn];
int bt[maxn][4],ip[4],mask[4];
int main()
{
int n;
while(cin>>n)
{
memset(ip,0,sizeof(ip));
memset(mask,0,sizeof(mask));
memset(str,0,sizeof(str));
memset(ip2,0,sizeof(ip2));
memset(mask2,0,sizeof(mask2));
memset(bt,0,sizeof(bt));
int z=32;
for(int i=0;i<n;i++)
scanf("%d.%d.%d.%d",&bt[i][0],&bt[i][1],&bt[i][2],&bt[i][3]);
for(int i=0;i<n;i++)
{
for(int j=0;j<4;j++)
{
int t=128;
for(int k=0;k<8;k++)
{
if(bt[i][j]-t>=0)
{
str[i][j*8+k]='1';
bt[i][j]-=t;
}
else
str[i][j*8+k]='0';
t/=2;
}
}
}
for(int i=0;i<32;i++)
{
int j=0;
for(j=0;j<n;j++)
{
if(str[0][i]!=str[j][i])
break;
}
if(j==n)
{
ip2[i]=str[0][i];
mask2[i]='1';
}
else
{
z=i;
break;
}
}
for(int i=z;i<32;i++)
{
ip2[i]='0';
mask2[i]='0';
}
for(int i=0;i<4;i++)
{
int x=128;
for(int j=0;j<8;j++)
{
if(ip2[i*8+j]=='1')
ip[i]+=x;
if(mask2[i*8+j]=='1')
mask[i]+=x;
x/=2;
}
}
cout<<ip[0]<<"."<<ip[1]<<"."<<ip[2]<<"."<<ip[3]<<endl;
cout<<mask[0]<<"."<<mask[1]<<"."<<mask[2]<<"."<<mask[3]<<endl;
}
return 0;
}

本文迁移自我的 CSDN博客 ,格式可能有所偏差。