题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int g_ip[3][4]; /* 3 按顺序表示掩码,两个子设备 */
int main(int argc, char** argv)
{
// freopen("input.txt", "r", stdin);
int i, j;
while (scanf("%d.%d.%d.%d", &g_ip[0][0], &g_ip[0][1], &g_ip[0][2], &g_ip[0][3]) != EOF) {
scanf("%d.%d.%d.%d", &g_ip[1][0], &g_ip[1][1], &g_ip[1][2], &g_ip[1][3]);
scanf("%d.%d.%d.%d", &g_ip[2][0], &g_ip[2][1], &g_ip[2][2], &g_ip[2][3]);
for (i = 0; i < 3; i++) { /* 保证数值均在 0-255 */
for (j = 0; j < 4; j++) if ((g_ip[i][j] < 0) || (g_ip[i][j] > 255)) break;
if (j < 4) break;
}
if (i < 3) { printf("1\n"); continue; }
for (i = 0; i < 4; i++) { /* 保证掩码是左 1 右 0 的标准格式 */
if (g_ip[0][i] == 255) continue;
for (j = i + 1; j < 4; j++) if (g_ip[0][j] != 0) break;
if (j < 4) break;
if ((g_ip[0][i] != 254) && (g_ip[0][i] != 252) && (g_ip[0][i] != 248) && (g_ip[0][i] != 240) &&
(g_ip[0][i] != 224) && (g_ip[0][i] != 192) && (g_ip[0][i] != 128) && (g_ip[0][i] != 0)) break;
}
if (i < 4) { printf("1\n"); continue; }
for (i = 0; i < 4; i++) { /* 匹配是否同一网络 */
if ((g_ip[1][i] & g_ip[0][i]) != (g_ip[2][i] & g_ip[0][i])) break;
}
if (i < 4) printf("2\n"); else printf("0\n");
}
// fclose(stdin);
return 0;
}