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