let str; let a=0,b=0,c=0,d=0,e=0,f=0,g=0; while(str = readline()){ let strArr = str.split(' '); getRes(strArr) } function getRes(strArr){ for(let v of strArr){ let vArr = v.split('~'); //这里题目有个小坑,就是如果子网掩码不正确了,那么我们就不需要再去判断IP了,我也是看了好久才发现 //第二个坑,如果是特殊的IP,那么子网掩码也不需要判断,我真的是被坑死了 //这种题写的就很想骂人... let ipArr = vArr[0].split('.'); if(ipArr[0] != 0 && ipArr[0] != 127){ let use = isUse(vArr[1]); if(use){//正确了再去判断IP的分类跟私有的问题 ipChoose(vArr[0]) }else{ continue; } }else{ continue; } } } //判断子网掩码有效性 function isUse(str){ let codeArr = str.split('.'); if(unSafeIp(codeArr)){ let codeStr = ''; codeArr.forEach((v)=>{ codeStr += parseInt(v,10).toString(2).padStart(8, '0'); }) if(!/^1+0+$/g.test(codeStr)){ f++; return false; }else{ return true; } }else{ return false; } } //判断IP function ipChoose(str){ let ipArr = str.split('.'); if(ipArr[0] != 0 && ipArr[0] != 127){ let use = unSafeIp(ipArr); if(use){ if(privateIp(ipArr)){ g++; } ipCate(ipArr); } } } //无效IP判断 function unSafeIp(arr){ //无效情况:1.根据.号分割后,输入的不是数字 2.根据.号分割后,数组的长度不等于4 3.根据.号分割后,数组有元素为空 if(arr.length != 4){ f++; return false; }else{ for(let v of arr){ if(isNaN(v) || v=='' || v<0 || v>255){ f++; return false; } } } return true; } //私有IP判断 function privateIp(v){ if(v[0] == 10) return true; if(v[0] == 172 && (v[1] >= 16 && v[1] <= 31)) return true; if(v[0] == 192 && v[1] == 168) return true; return false; } //ip分类判断 function ipCate(v){ if(v[0] > 0 && v[0] <127){ a++; }else if(v[0] > 127 && v[0] <192){ b++; }else if(v[0] > 191 && v[0] <224){ c++; }else if(v[0] > 223 && v[0] <240){ d++; }else if(v[0] > 239 && v[0] <256){ e++; } } console.log(a,b,c,d,e,f,g)