您的位置:首页 > 其它

小紫书 4-5 UVA 1590 IP Networks

2016-02-23 00:48 302 查看
题解:

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int m, n = 32;
bool net[32], add[32];
void str_to_add(char str[20], int x)
{
for (int i = 0, j = 0, tmp = 0; j < 20; ++i)
{
if (str[i] >= '0'&&str[i] <= '9')
tmp = tmp * 10 + str[i] - '0';
else if (str[i] == '.')
{
for (int k = 0; k < 8; ++k)
{
if (tmp&(1 << k))
add[j * 8 + 7 - k] = 1;
}
tmp = 0; ++j;
}
else if (str[i] == 0)
{
for (int k = 0; k < 8; ++k)
{
if (tmp&(1 << k))
add[j * 8 + 7 - k] = 1;
}
tmp = 0; break;
}
}
}
int main()
{
//freopen("input.txt", "r", stdin);
char str[20];
while (scanf("%d", &m) != EOF)
{
n = 32;
for (int i = 0; i < m; ++i)
{
memset(add, 0, sizeof(add));
memset(str, 0, sizeof(str));
scanf("%s", str);
str_to_add(str, i);
if (i == 0)
{
for (int j = 0; j < 32; ++j)
net[j] = add[j];
}
else
{
for (int j = 0; j < n; ++j)
if (net[j] != add[j])
{
n = j;
for (int k = n; k < 32; ++k)
net[k] = 0;
break;
}
}
}
int net1[4] = { 0 }, mask[4] = { 0 };
for (int i = 0; i < 32; ++i)
net1[i / 8] = net1[i / 8] * 2 + net[i];
for (int t = n, i = 0; t > 0; ++i)
{
if (t >= 8)
mask[i] = 255;
else
mask[i] = 255 - ((1 << (8 - t)) - 1);
t -= 8;
}
for (int i = 0; i < 4; ++i)
{
printf("%d", net1[i]);
if (i == 3)
printf("\n");
else
printf(".");
}
for (int i = 0; i < 4; ++i)
{
printf("%d", mask[i]);
if (i == 3)
printf("\n");
else
printf(".");
}
}
//system("pause");
//while (1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: