小坑略多 怪我没有透彻领悟题意
import java.util.Scanner; public class Main { private static int A = 0; private static int B = 0; private static int C = 0; private static int D = 0; private static int E = 0; private static int wrongIpOrMaskCount = 0; private static int privateIpCount = 0; public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextLine()) { String s = in.nextLine(); solution(s); } System.out.printf("%d %d %d %d %d %d %d", A, B, C, D, E, wrongIpOrMaskCount, privateIpCount); } public static void solution(String s) { String[] ipAndMask = s.split("~"); String ip = ipAndMask[0]; String mask = ipAndMask[1]; boolean isLegalIp = isLegalIp(ip); boolean isLegalMask = isLegalMask(mask); if (isLegalIp) { int[] vip = values(ip); if (isLegalMask) { int[] vm = values(mask); stat(mask(vip, vm)); } else { // 【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略 if (vip[0] != 0 && vip[0] != 127) { wrongIpOrMaskCount++; } } } else { wrongIpOrMaskCount++; } } public static int[] mask(int[] v, int[] m) { for (int i = 0; i < v.length; i++) { v[i] &= m[i]; } return v; } public static void stat(int[] v) { // A 类地址从 1.0.0.0 到 126.255.255.255 if (1 <= v[0] && v[0] <= 126) { A++; } // B 类地址从 128.0.0.0 到 191.255.255.255 if (128 <= v[0] && v[0] <= 191) { B++; } // C 类地址从 192.0.0.0 到 223.255.255.255 if (192 <= v[0] && v[0] <= 223) { C++; } // D 类地址从 224.0.0.0 到 239.255.255.255 if (224 <= v[0] && v[0] <= 239) { D++; } // E 类地址从 240.0.0.0 到 255.255.255.255 if (240 <= v[0] && v[0] <= 255) { E++; } // 私网IP范围是:[10.0.0.0, 10.255.255.255] [172.16.0.0, 172.31.255.255] [192.168.0.0, 192.168.255.255] // 私有IP地址和 A,B,C,D,E 类地址是不冲突的 if (v[0] == 10 || (v[0] == 172 && 16 <= v[1] && v[1] <= 31) || (v[0] == 192 && v[1] == 168)) { privateIpCount++; } } public static boolean isLegalMask(String mask) { if (!isLegalIp(mask)) { return false; } else { int[] v = values(mask); int x = v[0] << 24 | v[1] << 16 | v[2] << 8 | v[3]; // 二进制下全是0或者全是1均为非法子网掩码 if (x == 0 || x == -1) { return false; } boolean hasSeenZero = false; while (x != 0) { // 最高位为1 则这个数为负数 if (x < 0) { // 一旦看到0,就不应该有1 if (hasSeenZero) { return false; } } else { hasSeenZero = true; } x <<= 1; } return true; } } public static int[] values(String ip) { String[] strs = ip.split("\\."); int[] v = new int[strs.length]; for (int i = 0; i < v.length; i++) { v[i] = Integer.parseInt(strs[i]); } return v; } public static boolean isLegalIp(String s) { String[] ip = s.split("\\."); if (ip.length != 4) { return false; } int legalCount = 0; for (int i = 0; i < ip.length; i++) { // ip的合法范围是 [0, 255] if (ip[i].matches("[1-9]\\d*|0") && Integer.parseInt(ip[i]) <= 255) { legalCount++; } } return legalCount == 4; } }