HJ19 识别有效的IP地址和掩码并进行分类统计 | 题解
- 查看 IP 第一段是否为
0
或127
,若是则忽略; - 判断子网掩码是否合法,如果满足下列条件之一即为非法掩码
- 数字段数不为
4
- 在二进制下,不满足前面连续是
1
,然后全是0
- 在二进制下,全为
0
或全为1
- 判断 IP 地址是否合法,如果满足下列条件之一即为非法地址
- 数字段数不为
4
,比如存在空段,即192..1.0
这种; - 某个段的数字大于
255
-
判断 IP 是否是 ABCDE 类地址,若是,则对应类加一。 所有的 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 是否是私有地址。 私网IP范围是:
10.0.0.0~10.255.255.255
、172.16.0.0~172.31.255.255
、192.168.0.0~192.168.255.25
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int aNum = 0, bNum = 0, cNum = 0, dNum = 0, eNum = 0, errNum = 0, priNum = 0;
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
String[] strs = in.nextLine().split("~");
String[] ips = strs[0].split("\\.");
int ipFirst = Integer.valueOf(ips[0]);
int ipSecond = Integer.valueOf(ips[1]);
if (ipFirst == 0 || ipFirst == 127) {
continue;
}
if (!maskValid(strs[1])) {
errNum++;
continue;
}
if (!ipValid(strs[0])) {
errNum++;
continue;
}
if (ipFirst >= 1 && ipFirst <= 126) {
aNum++;
}
if (ipFirst >= 128 && ipFirst <= 191) {
bNum++;
}
if (ipFirst >= 192 && ipFirst <= 223) {
cNum++;
}
if (ipFirst >= 224 && ipFirst <= 239) {
dNum++;
}
if (ipFirst >= 240 && ipFirst <= 255) {
eNum++;
}
if (ipFirst == 10 || (ipFirst == 172 && ipSecond >= 16 && ipSecond <= 31) || (ipFirst == 192 && ipSecond == 168)) {
priNum++;
}
}
System.out.println(aNum + " " + bNum + " " + cNum + " " + dNum + " " + eNum + " " + errNum + " " + priNum);
}
public static boolean ipValid(String str) {
String[] ip = str.split("\\.");
if (ip.length != 4) {
return false;
}
for (String s : ip) {
if (Integer.parseInt(s) < 0 || Integer.parseInt(s) > 255) {
return false;
}
}
return true;
}
public static boolean maskValid(String str) {
if (!ipValid(str)) {
return false;
}
String[] mask = str.split("\\.");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mask.length; i++) {
mask[i] = Integer.toBinaryString(Integer.parseInt(mask[i]));
if (mask[i].length() < 8) {
for (int j = 0; j < 8 - mask[i].length(); j++) {
sb.append("0");
}
sb.append(mask[i]);
} else {
sb.append(mask[i]);
}
}
return sb.toString().lastIndexOf("1") < sb.toString().indexOf("0");
}
}