题目描述:
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
A类地址1.0.0.0~126.255.255.255;
B类地址128.0.0.0~191.255.255.255;
C类地址192.0.0.0~223.255.255.255;
D类地址224.0.0.0~239.255.255.255;
E类地址240.0.0.0~255.255.255.255
私网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
子网掩码为前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
本题暂时默认
以0开头的IP地址是合法的,比如0.1.1.2,是合法地址
Java实现:
import java.util.*; public class Main { public static void main(String[] args){ Scanner sc=new Scanner(System.in); int isA=0; int isB=0; int isC=0; int isD=0; int isE=0; int isEroor=0; int isPrivate=0; while(sc.hasNextLine()){ String str=sc.nextLine(); String[] ips=str.split("~"); //判断掩码是否合法 boolean isMask=false; String[] maskArr=ips[1].split("\\."); String binaryMask=""; //形成掩码二进制字符串 for(int i=0;i<maskArr.length;i++){ String binaryStr=Integer.toBinaryString(Integer.parseInt(maskArr[i])); //凑成4组8位二进制 for(int j=0;j<8-binaryStr.length();j++){ binaryStr="0"+binaryStr; } binaryMask+=binaryStr; } //比较二进制字符串中第一个0的位置和最后一个1的位置来判断掩码是否合法 if(binaryMask.indexOf("0")<binaryMask.lastIndexOf("1")){ isMask=false; }else { isMask=true; } //掩码合法后再来判断IP是否合法 if(isMask){ String[] strArr=ips[0].split("\\."); if(strArr.length==4){ int[] ipArr=new int[4]; for(int i=0;i<4;i++){ if(strArr[i]==""){ ipArr[i]=-1; }else { ipArr[i]=Integer.parseInt(strArr[i]); } } if((0<=ipArr[0]&&ipArr[0]<=255) && (0<=ipArr[1]&&ipArr[1]<=255) && (0<=ipArr[2]&&ipArr[2]<=255) && (0<=ipArr[3]&&ipArr[3]<=255)){ if(ipArr[0]>=1 && ipArr[0]<=126){ isA++; if(ipArr[0]==10) isPrivate++; }else if(ipArr[0]>=128 && ipArr[0]<=191){ isB++; if(ipArr[0]==172 && (ipArr[1]>=16 && ipArr[1]<=31)) isPrivate++; }else if (ipArr[0]>=192 && ipArr[0]<=223) { isC++; if(ipArr[0]==192 && ipArr[1]==168) isPrivate++; }else if (ipArr[0]>=224 && ipArr[0]<=239) { isD++; }else if (ipArr[0]>=240 && ipArr[0]<=255) { isE++; } }else{ isEroor++; } }else { isEroor++; } }else { isEroor++; } } System.out.println(isA+" "+isB+" "+isC+" "+isD+" "+isE+" "+isEroor+" "+isPrivate); sc.close(); } }
知识点:
- 在这里判断ip地址是否合法就是判断其是否由四个0到255之间的数字和三个.构成
- 在正则表达式中“.”表示任意一个字符,因此在用.来分隔字符串时要进行转义\\.
- 私有IP地址也可以属于某一类