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); }
}