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

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

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

#include <iostream>
#include <ostream>
#include <string>
using namespace std;
bool ipzwcheck(string str);
bool ipcheck(string str);
string o2b(int num);
int main() {
    string str,ip,ipzw;
    int count[7]={0};
    while(cin>>str){
        ip=str.substr(0,str.find('~'));
        ipzw=str.substr(str.find('~')+1,str.size()-str.find('~')-1);
        int ipc=stoi(ip.substr(0,ip.find('.')));
        if(ipcheck(ip)&&ipzwcheck(ipzw)){
            if(ipc>=1&&ipc<=126){count[0]++;}
            else if(ipc>=128&&ipc<=191){count[1]++;}
            else if(ipc>=192&&ipc<=223){count[2]++;}
            else if(ipc>=224&&ipc<=239){count[3]++;}
            else if(ipc>=240&&ipc<=255){count[4]++;}
            if(ipc==10){
                count[6]++;
            }
            if(ipc==172){
                if(ip.substr(4,3)=="17."||ip.substr(4,3)=="16.")
                count[6]++;
            }
            if(ipc==192){
            if(ip.substr(4,3)=="168")
                count[6]++;
            }
        }
        else if(ipc!=0&&ipc!=127) count[5]++;
       
    } 
    for(int i=0;i<7;i++){
        if(i<6)
            cout<<count[i]<<" ";
        else
            cout<<count[i]<<endl;
    }
    return 0;
}
bool ipzwcheck(string str){
    bool flag=true;
    int num[4]={0};
    string bnum;
    for(int i=0;i<4;i++){
        if(str.substr(0,str.find('.'))=="")return false;
        num[i]=stoi(str.substr(0,str.find('.')));
        str=str.substr(str.find('.')+1,str.size()-str.find('.')-1);
        bnum+=o2b(num[i]);
    }
    if(bnum[0]=='0'||bnum[bnum.size()-1]=='1'){flag=false;}
    else if(bnum.substr(0,bnum.rfind('1')).find('0')!=-1){flag=false;}
    return flag;

}
string o2b(int num){
    string str;
    while(num){
        str.insert(0,1,'0'+num%2);
        num/=2;
    }
    if(str.size()<8){
        str.insert(0,8-str.size(),'0');
    }
    return str;
}
bool ipcheck(string str){
    for(int i=0;i<4;i++){
        if(str.substr(0,str.find('.'))=="")return false;
        str=str.substr(str.find('.')+1,str.size()-str.find('.')-1);
    }
    return true;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务