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



京公网安备 11010502036488号