JS 52行代码,因为没有声明太多变量,所以代码看起来比较乱,但是读注释看懂了还好,是我认为比较好理解的一个思路 按照这个思路的话,还是很容易避免一些容易犯的错误的,例如:IP地址是私有的情况,IP地址和子网掩码都不合法的情况,还是比较容易避免的
var A = 0 , B = 0 , C = 0 , D = 0 , E = 0 , Error = 0 , Pro = 0
while(line=readline()){
var lines = line.split(' ')
var a = lines[0]
var x = 0 , y = 0 //当 y=1 或者 x=1 的时候说明不合法,因此初始值赋为0(以下都是)
var ip = (a.split('~')[0]).split('.') //IP地址和子网掩码分别为按‘~’分隔后的数组下标的‘0’和‘1’,再按照‘.’进行分割得到每一个数字
var sub = (a.split('~')[1]).split('.') //分隔后的结果为 ip:地址中按‘.’分隔后的数组 sub:子网掩码中按‘.’分隔后的数组
if(parseInt(ip[0]) == 0 || parseInt(ip[0]) == 127) //0开头或者127开头的IP地址不合法,因为之前有进行分割,所以用数组中的第一个数判断
y = 1 //不合法
if(y == 0){ //先判断子网掩码是否合法,如果子网掩码已经不合法了,不必在判断IP地址
if( a.split('~')[1] == '255.255.255.255' || a.split('~')[1] == '0.0.0.0'){ //子网掩码全是0或者全是255不合法
x = 1
}
if( parseInt(sub[0]) < 128 && parseInt(sub[0]) != 0 || parseInt(sub[1]) < 128 && parseInt(sub[1]) != 0 || parseInt(sub[2]) < 128 && parseInt(sub[2]) != 0 || parseInt(sub[3]) < 128 && parseInt(sub[3]) != 0 ){
x=1 //因为这里子网掩码转换为2进制为8byte,不足八位用0补在前面,所以这里转为二进制之后不足八位的都不合法,128为八位二进制的临界值
}
var str = parseInt(sub[0]).toString(2) + parseInt(sub[1]).toString(2) + parseInt(sub[2]).toString(2) + parseInt(sub[3]).toString(2) //将子网掩码的每一个数全部转化为二进制再拼接到一起
for(var i=0 ; i<str.length ; i++){ //循环遍历每个元素
if( str[i] == 0 ) //根据子网掩码的合法性判断可以想到,前面都为1,当遇到第一个0的时候,后面应该都为0
for(var j=i ; j<str.length ; j++ )//当遇到第一个0时,继续向后遍历,如果再次遇到1,则不合法
if( str[j] == 1 )
x = 1
}
if( x == 0 ){ //判断每一个ip地址是否满足要求,如果超范围,不合法(以下都是)
if(parseInt(ip[0])>=1 && parseInt(ip[0])<=126 && parseInt(ip[1])>=0 && parseInt(ip[1])<=255 && parseInt(ip[2])>=0 && parseInt(ip[2])<=255 && parseInt(ip[3])>=0 && parseInt(ip[3])<=255)
if(parseInt(ip[0])==10){ //判断是否为私有,是的话,不光私有要+1,本身所属的类别也+1(以下都是)
A += 1
Pro += 1
}
else A += 1
else if(parseInt(ip[0])>=128 && parseInt(ip[0])<=191 && parseInt(ip[1])>=0 && parseInt(ip[1])<=255 && parseInt(ip[2])>=0 && parseInt(ip[2])<=255 && parseInt(ip[3])>=0 && parseInt(ip[3])<=255)
if(parseInt(ip[0])==172 && parseInt(ip[1])>=16 && parseInt(ip[1])<=31){
B += 1
Pro += 1
}
else B += 1
else if(parseInt(ip[0])>=192 && parseInt(ip[0])<=223 && parseInt(ip[1])>=0 && parseInt(ip[1])<=255 && parseInt(ip[2])>=0 && parseInt(ip[2])<=255 && parseInt(ip[3])>=0 && parseInt(ip[3])<=255)
if(parseInt(ip[0])==192 && parseInt(ip[1])==168){
C += 1
Pro += 1
}
else C += 1
else if(parseInt(ip[0])>=224 && parseInt(ip[0])<=239 && parseInt(ip[1])>=0 && parseInt(ip[1])<=255 && parseInt(ip[2])>=0 && parseInt(ip[2])<=255 && parseInt(ip[3])>=0 && parseInt(ip[3])<=255)
D += 1
else if(parseInt(ip[0])>=240 && parseInt(ip[0])<=255 && parseInt(ip[1])>=0 && parseInt(ip[1])<=255 && parseInt(ip[2])>=0 && parseInt(ip[2])<=255 && parseInt(ip[3])>=0 && parseInt(ip[3])<=255)
E += 1
else Error += 1 //如果不在范围内,不合法
}
else Error += 1 //子网掩码不合法的情况下,不必判断IP地址,直接输出不合法即可
}
}
console.log(A,B,C,D,E,Error,Pro) //最后输出每一个种类的个数即可