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)        //最后输出每一个种类的个数即可