题目较为简单,主要分为以下几步:
1.判断IP与子网掩码是否合法
(1)可以分为4份;
(2)是否为数字;
(3)IP需在0-255之间,子网掩码另外需判断是否左侧为1,右侧为0;
2.判断2个IP是否属于同一子网;
(1)直接进行位运算&
import java.util.*; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while (scan.hasNextLine()) { String[] masks = scan.nextLine().split("\\."); String[] ip1s = scan.nextLine().split("\\."); String[] ip2s = scan.nextLine().split("\\."); //判断IP地址或者子网掩码是否非法输入 if(!isLegalIP(ip1s)||!isLegalIP(ip2s)||!isLegalMask(masks)){ System.out.println(1); continue; } //判断IP地址是否为同一子网络 boolean flag=false; for(int i=0;i<4;i++){ int mask=Integer.parseInt(masks[i]); int ip1=Integer.parseInt(ip1s[i]); int ip2=Integer.parseInt(ip2s[i]); if((mask&ip1)!=(mask&ip2)) { flag=true; System.out.println(2); break; } } if(!flag) System.out.println(0); } } //判断子网掩码是否合法 public static boolean isLegalMask(String[] masks) { String mask=""; //不足四位 if (masks.length != 4) return false; for (String item : masks) { //非数字 if (item.equals("") || item.equals(" ")) return false; //超出数字范围 if(Integer.parseInt(item)>255||Integer.parseInt(item)<0) return false; String str=Integer.toBinaryString(Integer.parseInt(item)); while(str.length()<8){ str="0"+str; } // String str=String.format("%08d",Integer.parseInt(Integer.toBinaryString(Integer.parseInt(item)))); mask+=str; } //不符合数字规律 if(!mask.matches("1+0*")) return false; return true; } //判断IP地址是否合法 public static boolean isLegalIP(String[] ips) { if (ips.length != 4) return false; for (String item : ips) { //非数字 if (item.equals("") || item.equals(" ")) return false; //不符合数字规律 if (Integer.parseInt(item)>255||Integer.parseInt(item)<0) return false; } return true; } }