题目较为简单,主要分为以下几步:
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;
}
}

京公网安备 11010502036488号