import java.util.*; public class Main { // 记录统计结果 public static int A = 0; public static int B = 0; public static int C = 0; public static int D = 0; public static int E = 0; public static int Err = 0; public static int Pri = 0; // 主函数 public static void main(String[] args) { // 标准输入 Scanner input = new Scanner(System.in); // 循环获取ip地址和子网掩码 while (input.hasNextLine()) { String ip_subnetMask = input.nextLine(); // 拆分 String[] datas = ip_subnetMask.split("~"); String ip = datas[0]; String subnetMask = datas[1]; // 解析本组数据 parseData(ip, subnetMask); } // 数据解析完成,输出统计结果 System.out.println(A+" "+B+" "+C+" "+D+" "+E+" "+Err+" "+Pri); } // 解析输入数据 public static void parseData(String ip, String subnetMask) { // 预处理 if (ip.startsWith("0.") || ip.startsWith("127.")) return; // 先解析子网掩码 if (!parse_subnetMask(subnetMask)) return; // 子网掩码合法时再解析ip地址 if (!parse_ip(ip)) return; } // 解析子网掩码 public static boolean parse_subnetMask(String subnetMask) { // 使用正则表达式初步过滤 if (!subnetMask.matches("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+")) { Err++; return false; } // 二次过滤 // 先获取子网掩码的二进制形式 String[] nums = subnetMask.split("\\."); // 分割 StringBuffer maskBinary = new StringBuffer(); // 创建容器 // 拼接二进制字符串 for (String num : nums) { // 转十进制数字 int n = Integer.parseInt(num); // 转二进制字符串 String tempBinary = Integer.toBinaryString(n); // 将字符串补足至8位 while (tempBinary.length() < 8) { tempBinary = "0" + tempBinary; } // 拼接 maskBinary.append(tempBinary); } // 判断其二进制形式是否合法 if (!maskBinary.toString().matches("[1]+[0]+")) { Err++; return false; } // 子网掩码校验通过 return true; } // 解析ip地址 public static boolean parse_ip(String ip) { // 使用正则表达式初步过滤 if (!ip.matches("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+")) { Err++; return false; } // 二次过滤 String[] nums = ip.split("\\."); for (String num : nums) { // 子串长度不是1但是以0开头 if (num.length() != 1 && num.charAt(0) == '0') { Err++; return false; } // 数值越界 int n = Integer.parseInt(num); if (n < 0 || n > 255) { Err++; return false; } } // ip地址校验合法,则判断其分类 int firstNum = Integer.parseInt(nums[0]); // 判断ip地址分类 boolean isA = 1 <= firstNum && firstNum <= 126 ? true : false; boolean isB = 128 <= firstNum && firstNum <= 191 ? true : false; boolean isC = 192 <= firstNum && firstNum <= 223 ? true : false; boolean isD = 224 <= firstNum && firstNum <= 239 ? true : false; boolean isE = 240 <= firstNum && firstNum <= 255 ? true : false; // 统计ip地址分类 if (isA) A++; if (isB) B++; if (isC) C++; if (isD) D++; if (isE) E++; // 判断ip地址是否为私有地址 int secondNum = Integer.parseInt(nums[1]); // 判断私有地址分类 boolean isPri_1 = firstNum == 10 ? true : false; boolean isPri_2 = (firstNum == 172 && 16 <= secondNum && secondNum <= 31) ? true : false; boolean isPri_3 = (firstNum == 192 && secondNum == 168) ? true : false; // 当前ip地址满足其中一种则为私有地址 if (isPri_1 || isPri_2 || isPri_3) Pri++; // ip地址解析完成 return true; } }