此题,可以说挺难,但我认为不是难,是恶心,没有什么高深的算法,只是有很多细节要注意,此题分两步。
1.将字符串转换成对应的ip地址和子网掩码。
2.进行分类,判断。
当然对于ip的分类比较好分类,但是子网掩码你需要判断,是不是开头全是1之后全是0,这也比较恶心。
在上代码之前,说一下,这道题测试用例就1个,而且就是题目给出的,你直接cout<<"1 0 1 0 0 2 1"就能通过,但是我不建议这样做,自己尝试写写,折磨一下,会有进步的。
#include<iostream> #include<string> using namespace std; bool IsSafe(unsigned char n) { bool flag = false; while (n) { if (!(n & 0x80)) { flag = true; } else { if (flag) { return false; } } n = n << 1; } return true; } void Calculate(int *ip, int *subnet, int &a, int &b, int &c, int &d, int &e, int &ipError, int &privateIp) { int i = 0; bool isIpError = false; bool isSubNetError = false; for (; i < 4; i++) { if (ip[i] < 0 || ip[i] > 255) { isIpError = true; break; } } //子网掩码 bool numFlag = false; for (i = 0; i < 4; i++) { if (!numFlag) { if (subnet[i] != 255) { if (IsSafe(subnet[i])) { numFlag = true; } else { isSubNetError = true; break; } } else { continue; } } else { if (subnet[i] != 0) { isSubNetError = true; break; } } } if (isIpError || isSubNetError) { ipError++; } else { //ip分类 if (ip[0] >= 0 && ip[0] <= 126) { a++; } else if (ip[0] >= 128 && ip[0] <= 191) { b++; } else if (ip[0] >= 192 && ip[0] <= 223) { c++; } else if (ip[0] >= 224 && ip[0] <= 239) { d++; } else if (ip[0] >= 240 && ip[0] <= 255) { e++; } //私有Ip if (ip[0] == 10 || (ip[0] == 172 && ip[1] >= 16 && ip[1] <= 31) || (ip[0] == 192 && ip[1] == 168)) { privateIp++; } } } void Trans(string inStr, int *ip, int *subnet) { int i = 0, j = 0; int tmp = 0; bool flag = false; //ip while (1) { while (inStr[i] != '.' && inStr[i] != '~') { tmp = tmp * 10 + inStr[i] - '0'; flag = true; i++; } if (flag) { flag = false; ip[j] = tmp; tmp = 0; } if (inStr[i] == '~') { break; } i++; j++; } j = 0; tmp = 0; i++; //subnet while (1) { while (inStr[i] != '.' && i < inStr.size()) { tmp = tmp * 10 + inStr[i] - '0'; flag = true; i++; } if (flag) { flag = false; subnet[j] = tmp; tmp = 0; } if (i == inStr.size()) { break; } i++; j++; } } int main() { int ip[4], subnet[4]; string inStr = ""; int i = 0, j = 0; //初始化 for (; i < 4; i++) { ip[i] = -1; subnet[i] = -1; } int A = 0, B = 0, C = 0, D = 0, E = 0, IPError = 0, PrivateIP = 0; while (getline(cin, inStr)) { Trans(inStr, ip, subnet); Calculate(ip, subnet, A, B, C, D, E, IPError, PrivateIP); for (j = 0; j < 4; j++) { ip[j] = -1; subnet[j] = -1; } } cout << A << ' ' << B << ' ' << C << ' ' << D << ' ' << E << ' ' << IPError << ' ' << PrivateIP << endl; return 0; }