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