題目描述
請解析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
輸入描述
多行字符串。每行一個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;
/**
* Author: 王俊超
* Time: 2016-04-24 13:02
* CSDN: http://blog.csdn.net/derrantcm
* Github: https://github.com/Wang-Jun-Chao
* Declaration: All Rights Reserved !!!
*/
public class Main {
private static int a = 0; // A類IP
private static int b = 0; // B類IP
private static int c = 0; // C類IP
private static int d = 0; // D類IP
private static int e = 0; // E類IP
private static int error = 0; // 錯誤IP
private static int pri = 0; // 私有IP
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s = scanner.next();
checkIp(s);
}
System.out.println(a + " " + b + " " + c + " " + d + " " + e + " " + error + " " + pri);
scanner.close();
}
private static void checkIp(String s) {
String[] str = s.split("~");
String ip = str[0];
String mask = str[1];
String[] ipParts = ip.split("\\.");
String[] maskParts = mask.split("\\.");
int[] ipInts = new int[4];
int[] maskInts = new int[4];
// 判斷IP是否由4部分組成
if (ipParts.length != 4 || maskParts.length != 4) {
error++;
return;
}
// 判斷IP中的每一部分格式
for (int i = 0; i < 4; i++) {
if (" ".equals(ipParts[i]) || " ".equals(maskParts[i])) {
error++;
return;
}
}
// 將IP解析成數字
for (int i = 0; i < 4; i++) {
ipInts[i] = Integer.parseInt(ipParts[i]);
maskInts[i] = Integer.parseInt(maskParts[i]);
if (ipInts[i] > 255 || maskInts[i] > 255) {
error++;
return;
}
}
// 將掩碼轉成二進制格式
String temp = "";
for (int i = 0; i < maskParts.length; i++) {
BigInteger bi = new BigInteger(maskParts[i]);
temp += bi.toString(2);
}
// 找掩碼二進制格式中的第一個0位置
int index = temp.indexOf("0");
temp = temp.substring(index + 1);
// 掩碼中,第一個0後若是有1說明掩碼不合法
if (temp.contains("1")) {
error++;
return;
}
if (ipInts[0] >= 1 && ipInts[0] <= 126) {
a++;
}
if (ipInts[0] >= 128 && ipInts[0] <= 191) {
b++;
}
if (ipInts[0] >= 192 && ipInts[0] <= 223) {
c++;
}
if (ipInts[0] >= 224 && ipInts[0] <= 239) {
d++;
}
if (ipInts[0] >= 240 && ipInts[0] <= 255) {
e++;
}
if (ipInts[0] == 10) {
pri++;
}
if (ipInts[0] == 172) {
if (ipInts[1] >= 16 && ipInts[1] <= 31) {
pri++;
}
}
if (ipInts[0] == 192) {
if (ipInts[1] == 168) {
pri++;
}
}
}
}