题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include<iostream>
#include<vector>
using namespace std;
vector<int> e(string a)
{
vector<int>d;
int c=0;
for(int i=0;i<a.length();i++)
{
if(a[i]=='.'&&i!=0)
{
int b=0;
for(int j=0;j<i;j++)
{
b=b*10+a[j]-'0';
}
d.push_back(b);
a=a.substr(i+1,a.length());
c++;
i=-1;
}
else if(a[i]=='.'&&i==0)
{
d.push_back(-1);;
a=a.substr(i+1,a.length());
c++;
i=-1;
}
}
if(a.length()>=1)
{
int b=0;
for(int j=0;j<a.length();j++)
{
b=b*10+a[j]-'0';
}
d.push_back(b);
}
else
{
d.push_back(-1);
}
return(d);
}
int main()
{
string a;
int d[7]={0};
while(cin>>a)
{
string b,c;
for(int i=0;i<a.length();i++)
{
if(a[i]=='~')
{
b=a.substr(0,i);
c=a.substr(i+1,a.length());
break;
}
}
vector<int>f,g;
f=e(b);
g=e(c);
if(f[0]==0||f[0]==127)
{
continue;
}
vector<int>h;
for(int i=0;i<4;i++)
{
vector<int>w;
if(g[i]!=0)
{
while(g[i])
{
w.push_back(g[i]%2);
g[i]=g[i]/2;
}
if(w.size()<8)
{
d[5]++;
goto x;
}
while(w.size()){
h.push_back(w.back());
w.pop_back();
}
}
else if(g[i]==0)
{
h.push_back(0);
}
}
for(int i=0;i<h.size();i++)
{
if(h[i]==0)
{
for(int j=i+1;j<h.size();j++)
{
if(h[j]==1)
{
d[5]++;
goto x;
}
}
}
else if(h[i]==0&&i==0)
{
d[5]++;
goto x;
}
else if(h[i]==1&&i==h.size()-1)
{
d[5]++;
goto x;
}
}
if(f[2]>=0&&f[2]<=255&&f[3]>=0&&f[3]<=255)
{
if(f[1]>=0&&f[1]<=255)
{
if(f[0]>=1&&f[0]<=126)
{
if(f[0]==10)
{
d[6]++;
}
d[0]++;
}
else if(f[0]>=128&&f[0]<=191)
{
if(f[0]==172&&f[1]>=16&&f[1]<=31)
{
d[6]++;
}
d[1]++;
}
else if(f[0]>=192&&f[0]<=223)
{
if(f[0]==192&&f[1]==168)
{
d[6]++;
}
d[2]++;
}
else if(f[0]>=224&&f[0]<=239)
{
d[3]++;
}
else if(f[0]>=240&&f[0]<=255)
{
d[4]++;
}
else
{
d[5]++;
}
}
else
{
d[5]++;
}
}
else
{
d[5]++;
}
x:
continue;
}
for(int i=0;i<7;i++)
{
cout<<d[i]<<' ';
}
return(0);
}
#include<vector>
using namespace std;
vector<int> e(string a)
{
vector<int>d;
int c=0;
for(int i=0;i<a.length();i++)
{
if(a[i]=='.'&&i!=0)
{
int b=0;
for(int j=0;j<i;j++)
{
b=b*10+a[j]-'0';
}
d.push_back(b);
a=a.substr(i+1,a.length());
c++;
i=-1;
}
else if(a[i]=='.'&&i==0)
{
d.push_back(-1);;
a=a.substr(i+1,a.length());
c++;
i=-1;
}
}
if(a.length()>=1)
{
int b=0;
for(int j=0;j<a.length();j++)
{
b=b*10+a[j]-'0';
}
d.push_back(b);
}
else
{
d.push_back(-1);
}
return(d);
}
int main()
{
string a;
int d[7]={0};
while(cin>>a)
{
string b,c;
for(int i=0;i<a.length();i++)
{
if(a[i]=='~')
{
b=a.substr(0,i);
c=a.substr(i+1,a.length());
break;
}
}
vector<int>f,g;
f=e(b);
g=e(c);
if(f[0]==0||f[0]==127)
{
continue;
}
vector<int>h;
for(int i=0;i<4;i++)
{
vector<int>w;
if(g[i]!=0)
{
while(g[i])
{
w.push_back(g[i]%2);
g[i]=g[i]/2;
}
if(w.size()<8)
{
d[5]++;
goto x;
}
while(w.size()){
h.push_back(w.back());
w.pop_back();
}
}
else if(g[i]==0)
{
h.push_back(0);
}
}
for(int i=0;i<h.size();i++)
{
if(h[i]==0)
{
for(int j=i+1;j<h.size();j++)
{
if(h[j]==1)
{
d[5]++;
goto x;
}
}
}
else if(h[i]==0&&i==0)
{
d[5]++;
goto x;
}
else if(h[i]==1&&i==h.size()-1)
{
d[5]++;
goto x;
}
}
if(f[2]>=0&&f[2]<=255&&f[3]>=0&&f[3]<=255)
{
if(f[1]>=0&&f[1]<=255)
{
if(f[0]>=1&&f[0]<=126)
{
if(f[0]==10)
{
d[6]++;
}
d[0]++;
}
else if(f[0]>=128&&f[0]<=191)
{
if(f[0]==172&&f[1]>=16&&f[1]<=31)
{
d[6]++;
}
d[1]++;
}
else if(f[0]>=192&&f[0]<=223)
{
if(f[0]==192&&f[1]==168)
{
d[6]++;
}
d[2]++;
}
else if(f[0]>=224&&f[0]<=239)
{
d[3]++;
}
else if(f[0]>=240&&f[0]<=255)
{
d[4]++;
}
else
{
d[5]++;
}
}
else
{
d[5]++;
}
}
else
{
d[5]++;
}
x:
continue;
}
for(int i=0;i<7;i++)
{
cout<<d[i]<<' ';
}
return(0);
}