题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int dA = 0, dB = 0, dC = 0, dD = 0, dE = 0, dW = 0, dP = 0;
    string s;
    while (getline(cin, s)) {
        int n = s.size();
        vector<int> ips;    //记录ip数字
        bool bad = false;
        bool isnum = false;
        int num = 0;
        for (int i = 0; i < n; i++) {   //切割ip
            if (s[i] == '.' || s[i] == '~') {
                if(isnum){
                    //num > 255 非法
                    if(num > 255){
                        bad = true;
                        break;
                    }
                    ips.push_back(num);
                    isnum = false;
                    num = 0;
                }
                else{   //非法字符
                    dW++;
                    bad = true;
                    break;
                }
            } else if (s[i] >= '0' && s[i] <= '9') { //数字计算
                isnum = true;
                num = num * 10 + s[i] - '0';
            }
            else{   //非法字符
                dW++;
                isnum = false;
                bad = true;
                break;
            }
        }
        if(isnum)
        {
            ips.push_back(num); //the last num
        }
        if(ips[0] == 0 || ips[0] == 127 || bad) //0,127,非法跳过
            continue;
        int mask = 4;   //掩码
        while (mask < 8 && ips[mask] == 255) {
            mask++;
        }
        if(mask == 8)   //掩码全1
        {
            dW++;
            continue;;
        }
        else if(ips[mask] == 254 || ips[mask] == 252 || ips[mask] == 248 || ips[mask] == 240 || ips[mask] == 224 || ips[mask] == 191 || ips[mask] == 128)
        {
            mask++;
        }
        while (mask < 8 && ips[mask] == 0) {
        mask++;
        }
        if(mask != 8){
            dW++;
            continue;
        }
         if(ips[0] >= 1 && ips[0] <= 126)
            dA++; //A类地址
        else if(ips[0] >= 128 && ips[0] <= 191)
            dB++; //B类地址
        else if(ips[0] >= 192 && ips[0] <= 223)
            dC++; //C类地址
        else if(ips[0] >= 224 && ips[0] <= 239)
            dD++; //D类地址
        else if(ips[0] >= 240 && ips[0] <= 255)
            dE++; //E类地址
        if(ips[0] == 10)
            dP++; //私有地址10开头的
        else if(ips[0] == 172 && (ips[1] >= 16 && ips[1] <= 31))
            dP++; //私有地址172.16.0.0-172.31.255.255
        else if(ips[0] == 192 && ips[1] == 168)
            dP++; //私有地址192.168.0.0-192.168.255.255
    }
    cout << dA << ' ' << dB << ' ' << dC << ' ' << dD<< ' ' << dE << ' ' << dW << ' ' << dP << endl;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务