import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); //3行输入,第1行是输入子网掩码、第2,3行是输入两个ip地址 //题目的示例中给出了三组数据,但是在实际提交时,你的程序可以只处理一组数据(3行)。 while (in.hasNextLine()){ String mask = in.nextLine(); String ip1 = in.nextLine(); String ip2 = in.nextLine(); invoke(mask,ip1,ip2); } } public static void invoke(String mask,String ip1,String ip2){ //若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2 if(!validMask(mask) || !validIP(ip1) || !validIP(ip2)){ System.out.println(1); return; } long maskNum = getNum(mask); long ip1Num = getNum(ip1); long ip2Num = getNum(ip2); if((maskNum & ip1Num) == (maskNum & ip2Num)){ System.out.println(0); }else{ System.out.println(2); } } /** * 有效掩码与IP的性质为: * 1. 掩码与IP每一段在 0 - 255 之间 * 2. 掩码的二进制字符串前缀为网络号,都由‘1’组成;后缀为主机号,都由'0'组成 */ private static boolean validIP(String ip){ String[] split = ip.split("\\."); for(String s : split){ Integer num = Integer.valueOf(s); if(num < 0 || 255<num){ return false; } } return true; } private static boolean validMask(String mask){ if(!validIP(mask)) { return false; } Long maskNum = getNum(mask); char[] chars = Long.toString(maskNum,2).toCharArray(); if(chars.length < 32){//注意! Long.toString方法会去除开头0 return false; } boolean exist0 = false; for(char c : chars){ if('0' == c){ exist0 = true; } if(exist0 && '1' == c ){ return false; } } return true; } private static Long getNum(String str){ String[] split = str.split("\\."); long maskNum = 0; int i = 3; for(String s : split){ Long num = Long.valueOf(s); maskNum |= num << i*8; i--; } return maskNum; } }