小紫書 4-5 UVA 1590 IP Networks
阿新 • • 發佈:2019-02-08
題解:
程式碼:
#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; }