题目描述
请解析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,是合法地址
输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
输入例子:
10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0
输出例子:
1 0 1 0 0 2 1
import java.math.BigInteger;
import java.util.Scanner;
/**
* 题目描述
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
* @author WGS
*/
public class Main{
private static int a =0;
private static int b =0;
private static int c =0;
private static int d =0;
private static int e =0;
private static int errors =0;
private static int privateIP =0;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String str=sc.next();
checkIp(str);
}
System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+errors+" "+privateIP);
sc.close();
}
private static void checkIp(String str) {//str:10.70.44.68~255.254.255.0
String[] s=str.split("~");
String[] ipStr=s[0].split("\\.");//获得IP: 10/70/44/68
String[] maskStr=s[1].split("\\.");//获得掩码:255.254.255.0
//****1 注意!!!错误IP地址或错误掩码的判断一定要放在最前面判断,因为判断出了是错误IP地址或错误掩码后
//就直接return,不用判断是不是后面的ABCDE类或者私有IP *****
//1-1 错误IP
if(ipStr.length!=4 || maskStr.length!=4){
errors++;//错误IP
return;
}
// 判断IP中的每一部分格式
for (int i = 0; i < 4; i++) {
if (" ".equals(ipStr[i]) || " ".equals(maskStr[i])) {
errors++;
return;
}
}
int[] ipInts = new int[4];
int[] maskInts = new int[4];
// 将IP解析成数字
for (int i = 0; i < 4; i++) {
ipInts[i] = Integer.parseInt(ipStr[i]);
maskInts[i] = Integer.parseInt(maskStr[i]);
if (ipInts[i] > 255 || maskInts[i] > 255) {
errors++;
return;
}
}
//1-2 错误掩码:255.255.255.32 必须是前面全为1,后面全为0,即从后往前至少有一位是0,且0前的数字全为1
//即首先得到第一个0的位置,再判断0后是否有1,有即为错误掩码
//将掩码转为为二进制:好判断0,1位置
String tempStr = "";
//例如将255.254.255.0转换成二进制:
//255:1111 1111
//254:1111 1110
//255:1111 1111
// 0:0
for(int i = 0; i<maskInts.length; i++){
String str2 = Integer.toBinaryString( maskInts[i] );
//判断一下:如果转化为二进制为0或者1或者不满8位,要在数后补0
int bit = 8-str2.length();
if(str2.length()<8){
for(int j=0; j<bit; j++){
str2 = "0"+str2;
}
}
tempStr += str2;
}
int indexOfFirstZero = tempStr.indexOf("0");
tempStr = tempStr.substring(indexOfFirstZero + 1);
if(tempStr.contains("1")){
errors++;
return;
}
//获得IP地址第一部分数字
int ipFirstPart=Integer.parseInt(ipStr[0]);
int ipSecondPart = Integer.parseInt(ipStr[1]);
//3 判断ABCDE 类IP 地址
if(ipFirstPart>= 1 && ipFirstPart <= 126 ){
a++;
//2 判断私有IP个数,私有IP和ABCDE 类IP地址判断不冲突,即IP是私有IP一类,也可以是ABCDE一类
if(ipFirstPart == 10){
privateIP++;
}
}
if(ipFirstPart>= 128 && ipFirstPart <= 191 ){
b++;
//2 判断私有IP个数
if(ipFirstPart == 172){
if(ipSecondPart >= 16 && ipSecondPart<= 31){
privateIP++;
}
}
}
if(ipFirstPart>= 192 && ipFirstPart <= 223 ){
c++;
//2 判断私有IP个数
if(ipFirstPart==192){
if(ipSecondPart == 168){
privateIP++;
}
}
}
if(ipFirstPart>= 224 && ipFirstPart <= 239 ){
d++;
}
if(ipFirstPart>= 240 && ipFirstPart <= 255 ){
e++;
}
}
}
标签:ipFirstPart,int,IP,++,OJ18,255.255,IP地址,掩码 From: https://blog.51cto.com/u_15886477/5877694