题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include <stdio.h> #include <string.h> int main() { int err = 0; int ip[4], ym[4], out[7]; memset(ip, -1, sizeof(ip)); memset(ym, -1, sizeof(ym)); memset(out, 0, sizeof(out)); char s[200]; while ( scanf("%s", s) != EOF) { // 注意 while 处理多个 case // 64 位输出请用 printf("%lld") to memset(ip, -1, sizeof(ip)); memset(ym, -1, sizeof(ym)); sscanf(s, "%d.%d.%d.%d~%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3], &ym[0], &ym[1], &ym[2], &ym[3]); if (ip[0] == 0 || ip[0] == 127 || ip[0] > 255 || ip[0] < 0) continue; for (int i = 0; i < 4; i++) { if (ip[i] == -1 || ym[i] == -1) { out[5]++; err = 1; goto end; } } if (ym[0] == 0 && ym[1] == 0 && ym[2] == 0 && ym[3] == 0) { out[5]++; continue; } if (ym[0] == 255 && ym[1] == 255 && ym[2] == 255 && ym[3] == 255) { out[5]++; continue; } for (int i = 0; i < 4; i++) { int temp = ym[i]; if (ym[i] != 255) { for (int j = i + 1; j < 4; j++) { if (ym[j] != 0) { out[5]++; err = 1; goto end; } } for (int j = 0; j < 8; j++) { if ((temp & 0x1) == 1) { if ((temp | 0xFF >> j) != temp) { out[5]++; err = 1; goto end; } } temp = temp >> 1; } break; } } if (ip[0] >= 1 && ip[0] <= 126) { out[0]++; if (ip[0] == 10)out[6]++; } if (ip[0] >= 128 && ip[0] <= 191) { out[1]++; if (ip[0] == 172 && (ip[1] <= 31 && ip[1] >= 16)) out[6]++; } if (ip[0] >= 192 && ip[0] <= 223) { out[2]++; if (ip[0] == 192 && ip[1] == 168) out[6]++; } if (ip[0] >= 224 && ip[0] <= 239) out[3]++; if (ip[0] >= 240 && ip[0] <= 255) out[4]++; // for (int i = 0; i < 4; i++) { // printf("%d\n", ip[i]); // } // for (int i = 0; i < 4; i++) { // printf("%d\n", ym[i]); // } end: if (err) err = 0; } printf("%d %d %d %d %d %d %d\n", out[0], out[1], out[2], out[3], out[4], out[5], out[6]); return 0; }