import java.util.*; public class Main { public static void main(String[] args) { // 标准输入 Scanner input = new Scanner(System.in); // 获取输入的子网掩码和两个ip地址 String mask = input.next(); String ip1 = input.next(); String ip2 = input.next(); // 解析本组数据 parse(mask, ip1, ip2); } // 解析数据 private static void parse(String mask, String ip1, String ip2) { // 校验子网掩码 if (!isLegalMask(mask)) { System.out.println(1); return; } // 校验ip地址 if (!isLegal_ip(ip1) || !isLegal_ip(ip2)) { System.out.println(1); return; } // 判断两ip地址是否在同一子网 String binary_ip1 = getBinary(ip1); String binary_ip2 = getBinary(ip2); String binary_mask = getBinary(mask); // 获取掩码中1的个数 int count = 0; for (char c : binary_mask.toCharArray()) { if (c == '1') count++; } // 按1的个数截取两ip的开头,比较其是否相等 String temp1 = binary_ip1.substring(0,count); String temp2 = binary_ip2.substring(0,count); // 判断后输出结果 if (temp1.equals(temp2)) { System.out.println(0); } else { System.out.println(2); } } // 判断ip地址是否合法 private static boolean isLegal_ip(String ip) { // 正则表达式首次过滤 if (!ip.matches("(\\d+\\.){3}\\d+")) return false; // 通过过滤的数据在形式上均为4数字+3个点 // 二次过滤 String[] nums = ip.split("\\."); for (String num : nums) { // 长度不为1,但以0开头 if (num.length() != 1 && num.startsWith("0")) return false; // 数值越界 int n = Integer.parseInt(num); if (n < 0 || 255 < n) return false; } // 通过过滤,校验合格 return true; } // 判断子网掩码是否合法 private static boolean isLegalMask(String mask) { // 先判断其是否为合法的ip if (!isLegal_ip(mask)) return false; // 二次过滤,校验子网掩码的二进制形式 String binaryMask = getBinary(mask); if (!binaryMask.matches("[1]+[0]+")) return false; // 通过校验,子网掩码合法 return true; } // 将ip地址转换为二进制形式 private static String getBinary(String ip) { // 初始化 StringBuffer binary = new StringBuffer(); // 拼接二进制形式 String[] nums = ip.split("\\."); for (String num : nums) { // 十进制字符串转十进制数字 int n = Integer.parseInt(num); // 十进制数字转二进制字符串 String tempBinary = Integer.toBinaryString(n); // 将二进制字符串补全至8位 while (tempBinary.length() < 8) { tempBinary = "0" + tempBinary; } // 拼接二进制字符串 binary.append(tempBinary); } // 返回拼接结果 return binary.toString(); } }