题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
这个题目纯是没事找事,把ip不属于任何一类,但是掩码错误混为一谈了,得去分开才可以
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
unsigned long A1 = 1 << 24;
unsigned long A2 = (126 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long B1 = 128 << 24;
unsigned long B2 = (191 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long C1 = 192 << 24;
unsigned long C2 = (223 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long D1 = 224 << 24;
unsigned long D2 = (239 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long E1 = 240 << 24;
unsigned long E2 = (255 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long S1 = 10 << 24;
unsigned long S2 = (10 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long S3 = (172 << 24) | (16 << 16);
unsigned long S4 = (172 << 24) | (31 << 16) | (255 << 8) | (255 << 0);
unsigned long S5 = (192 << 24) | (168 << 16);
unsigned long S6 = (192 << 24) | (168 << 16) | (255 << 8) | (255 << 0);
unsigned long N1 = 0;
unsigned long N2 = (0 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long N3 = 127 << 24;
unsigned long N4 = (127 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
//写一个函数判断子网掩码是否合格
vector<int> tonum(string ss)
{
vector<int> num;
for (int i = 0;i < ss.size();i++)
{
string s = "";
while (ss[i] != '.')
{
s += ss[i];
if (i == ss.size() - 1) break;
i++;
}
if (s.size() != 0) num.push_back(stoi(s));
}
return num;
}
bool subwebcode(string ss)
{
if (ss.size() < 7) return false;
if (ss[0] == '.' || ss[ss.size() - 1] == '.') return false;
vector<int> num = tonum(ss);
if (num.size() != 4) return false;
unsigned long tt = (num[0] << 24) | (num[1] << 16) | (num[2] << 8) | (num[3] << 0);
if (tt == 0)return false;
tt = ~tt;
tt++;
if (tt == 1) return false;
if (tt & (tt - 1)) return false;
return true;
}
//还得写一个函数看看是哪一类的ip
char checkip(string ss)
{
if (ss.size() < 7) return 'N';
if (ss[0] == '.' || ss[ss.size() - 1] == '.') return 'N';
vector<int> num = tonum(ss);
if (num.size() != 4) return 'N';
unsigned long tt = (num[0] << 24) | (num[1] << 16) | (num[2] << 8) | (num[3] << 0);
if ((tt >= S1 && tt <= S2))return 'Y';
if ((tt >= S3 && tt <= S4))return 'U';
if ((tt >= S5 && tt <= S6)) return 'M';
if ((tt >= N1 && tt <= N2 ) || (tt >= N3 && tt <= N4))return 'W';
if (tt >= A1 && tt <= A2)return 'A';
if (tt >= B1 && tt <= B2) return 'B';
if (tt >= C1 && tt <= C2)return 'C';
if (tt >= D1 && tt <= D2)return 'D';
if (tt >= E1 && tt <= E2)return 'E';
return 'N';
}
int main() {
vector<int> result(7, 0);
string sss;
while (getline(cin, sss))
{
string ss1 = sss.substr(0, sss.find('~'));
string ss2 = sss.substr(sss.find('~') + 1);
char rr = checkip(ss1);
if (rr == 'N') { result[5]++;continue; }
if(rr == 'W')continue;//傻逼题解,掩码错误,和ip不属于类混在一起
bool rr1 = subwebcode(ss2);
if (rr1 != true) { result[5]++;continue; }
switch (rr)
{
case 'A':result[0]++;break;
case 'B':result[1]++;break;
case 'C':result[2]++;break;
case 'D':result[3]++;break;
case 'E':result[4]++;break;
case 'S':result[6]++;break;
case 'Y':result[0]++;result[6]++;break;
case 'U':result[1]++;result[6]++;break;
case 'M':result[2]++;result[6]++;break;
case 'W':break;//不在任何一类
}
}
for (int a : result)cout << a << " ";
return 0;
}
