题解 | #识别有效的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;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务