Java题解
主要用到正则表达式以及二进制和字符串的转换
import java.util.*;
public class Main {

public static void main(String[] args) {
    // TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
String reg="\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}[~]\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
    //IP+掩码正规格式
String reg1="[1]+[0]+";
    //掩码转换为二进制正规格式
int A=0,B=0,C=0,D=0,E=0,s=0,F=0;
while (sc.hasNext()) {
    String IP=sc.nextLine();
    if (!IP.matches(reg)) {
        F++;
    }
    else {
        String[] t=IP.split("~") ;
        String[] t1=t[0].split("\\.");
        String[] t2=t[1].split("\\.");
        //将输入分为IP和掩码,再将IP和掩码拆分
        int p[]=new int[4];
        String y[]=new String[4];
        int y1[]=new int[4];
        String f[]=new String[4];

        for(int i=0;i<4;i++) {
          p[i]=Integer.valueOf(t1[i]);
          y1[i]=Integer.valueOf(t2[i]);
          y[i]=Integer.toBinaryString(Integer.valueOf(t2[i]));
          StringBuilder str= new StringBuilder(y[i]);
          //IP拆分后只需要获取数值,掩码拆分需要数值和字符串
          while(str.length()<8) {
              str.insert(0, "0");
          }
           //将掩码每一段补充为8为二进制
          f[i]=str.toString();
        }


        String L="";
        for (int i=0;i<f.length;i++) {
            L+=f[i];
        }
        //将掩码整合为32位二进制
        if(p[1]>255||p[2]>255||p[3]>255||y1[1]>255||y1[2]>255||y1[3]>255||(!L.matches(reg1))) {
            F++;
        }
        //判断掩码格式以及输入的数值是否超过8位二进制表示的十进制值
        else {
            if(p[0]>0&&p[0]<127) {
                A++;
                if(p[0]==10) {
                    s++;
                }

            }
            if(p[0]>127&&p[0]<192) {
                B++;
                if(p[0]==172&&p[1]>15&&p[1]<32) {
                    s++;
                }
            }
            if(p[0]>191&&p[0]<224) {
                C++;
                if(p[0]==192&&p[1]==168) {
                    s++;
                }
            }
            if(p[0]>223&&p[0]<240) {
                D++;
            }
            if(p[0]>239&&p[0]<256) {
                E++;
            }
        }


    }    

}
    System.out.println(A+" "+B+" "+C+" "+D+" "+E+" "+F+" "+s);
}

}