D类地址从224.0.0.0到239.255.255.255;
E类地址从240.0.0.0到255.255.255.255
私网IP范围是:
从10.0.0.0到10.255.255.255
从172.16.0.0到172.31.255.255
从192.168.0.0到192.168.255.255
子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
(注意二进制下全是1或者全是0均为非法子网掩码)
注意:
1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
2. 私有IP地址和A,B,C,D,E类地址是不冲突的
输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。
请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
示例1
输入:
10.70.44.68~255.254.255.0 1.0.0.1~255.0.0.0 192.168.0.2~255.255.255.0 19..0.~255.255.255.0
输出:
1 0 1 0 0 2 1
说明:
10.70.44.68~255.254.255.0的子网掩码非法,19..0.~255.255.255.0的IP地址非法,所以错误IP地址或错误掩码的计数为2; 1.0.0.1~255.0.0.0是无误的A类地址; 192.168.0.2~255.255.255.0是无误的C类地址且是私有IP; 所以最终的结果为1 0 1 0 0 2 1
示例2
输入:
0.201.56.50~255.255.111.255 127.201.56.50~255.255.111.255
输出:
0 0 0 0 0 0 0
说明:
类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
#include <bits/stdc++.h>
using namespace std;
int A1=0;
int B1=0;
int C1=0;
int D1=0;
int E1=0;
int w=0;//错误掩码
int p=0;
int main()
{
string str;
while(getline(cin,str))
{
int n=0;
int n1=0;//找点
int n11=0;//找第二个点
int n111=0;//找第二个点
int t1=0;//确定第几个的
//进行分段
for(int i=0;i<str.size();i++)
{
if(str[i]=='~')
n=i;
}
//str1
string str1=str.substr(0,n);
//str2
string str2=str.substr(n+1);//除去在n位置的
for(int i=0;i<str1.size();i++)
{
if(str1[i]=='.')
{
n1=i;
break;
}
}
for(int i=0;i<str2.size();i++)
{
if(str2[i]=='.')
{
n2=i;
break;
}
}
for(int i=0;i<str1.size();i++)
{
if(t1==2)
{
n11=i-1;
break;
}
if(str1[i]=='.')
{
t1++;
}
}
for(int i=0;i<str1.size();i++)
{
if(t1==3)
{
n111=i-1;
break;
}
if(str1[i]=='.')
{
t1++;
}
}
// cout<<stoi(str1.substr(0,n1))<<endl;
// cout<<stoi(str1.substr(n1+1,n11-1))<<endl;
// cout<<str2<<endl;
//判断字符串是否完整
for(int i=0;i<str1.size()-1;i++)
{
if((str1[i]=='.'&&str1[i+1]=='.')||(str[i]=='.'&&str[i+1]=='/0'))
{
str1="0.0.0.0";
w++;
break;
}
}
// cout<<str1<<endl;;
//A1 //p1
if (stoi(str1.substr(0, n1)) >= 1 &&stoi(str1.substr(0, n1)) <= 126)
{
if(str2=="255.0.0.0"||str2=="255.255.0.0"||str2=="255.255.255.0")
{
A1++;
if(stoi(str1.substr(0, n1)) == 10)
{
p++;
}
}
else
{
w++;
}
}
//B1 //p2
if (stoi(str1.substr(0, n1)) >= 128 &&stoi(str1.substr(0, n1)) <= 191)
{
if(str2=="255.0.0.0"||str2=="255.255.0.0"||str2=="255.255.255.0")
{
B1++;
if(stoi(str1.substr(0, n1)) ==172&&stoi(str1.substr(n1+1,n11-1))>=16&&stoi(str1.substr(n1+1,n11-1))<=31)
{
p++;
}
}
else
{
w++;
}
}
//C1
if (stoi(str1.substr(0, n1)) >= 192 &&stoi(str1.substr(0, n1)) <= 223)
{
if(str2=="255.0.0.0"||str2=="255.255.0.0"||str2=="255.255.255.0")
{
C1++;
if(stoi(str1.substr(0, n1)) == 192 &&stoi(str1.substr(n1+1,n11-1))==168)
{
p++;
}
}
else
{
w++;
}
}
//D1
if (stoi(str1.substr(0, n1)) >= 224 &&stoi(str1.substr(0, n1)) <= 239)
{
if(str2=="255.0.0.0"||str2=="255.255.0.0"||str2=="255.255.255.0")
{
D1++;
}
else
{
w++;
}
}
if (stoi(str1.substr(0, n1)) >= 240 &&stoi(str1.substr(0, n1)) <= 255)
{
if(str2=="255.0.0.0"||str2=="255.255.0.0"||str2=="255.255.255.0")
{
E1++;
}
else
{
w++;
}
}
}
cout<<A1<<" "<<B1<<" "<<C1<<" "<<D1<<" "<<E1<<" "<<w<<" "<<p;
}
尽力了,只通过80%,有没有大佬发现错误的地方,真诚求助