华为OJ——识别有效的IP地址和掩码并进行分类统计

来源:互联网 发布:网站建设优化及推广 编辑:程序博客网 时间:2024/05/13 05:20

题目描述

请解析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

代码

package cn.c_shuang.demo19;import java.util.Scanner;/** * 识别有效的IP地址和掩码并进行分类统计 * @author Cshuang * */public class Main {    public static int[]num=new int[7];    public static void main(String[] args) {        Scanner in =new Scanner(System.in);        while(in.hasNext()){            String ipMask=in.nextLine();            count(ipMask);        }        for (int i = 0; i < 7; i++) {            if(i!=6){                System.out.print(num[i]+" ");            }else                System.out.print(num[i]);        }        in.close();    }    public static void count(String ipMask) {        for (int n = 0; n < 1; n++) {//之所以加一个看似没意义的循环,主要目的是方便,后面的break;            String[] str=ipMask.split("~");            String[]ip=str[0].split("\\.");//正则表达式\\表示\,而.需要转义\.            String[]mask=str[1].split("\\.");            if(ip.length<4||mask.length<4){                num[5]++;                break;            }            for (int k = 0; k < 4; k++) {                if("".equals(ip[k])||"".equals(mask[k])                        ||" ".equals(ip[k])||" ".equals(mask[k])){                    num[5]++;                    break;                }            }            int[] ipInt=new int[4];            int[] maskInt=new int[4];            Long maskLong=0l;            for (int i = 0; i < 4; i++) {                ipInt[i]=Integer.parseInt(ip[i]);                maskInt[i]=Integer.parseInt(mask[i]);                if(ipInt[i]<0 || ipInt[i]>255 || maskInt[i]<0 || maskInt[i]>255){                    num[5]++;//只需要计一次                    break;                }            }            if (maskInt[0] == 255 && maskInt[1] == 255                    && maskInt[2] == 255 && maskInt[3] == 255) {                num[5]++;                break;            }            maskLong=(long) (maskInt[0]*(0xffffff+1)+maskInt[1]*(0xffff+1)+maskInt[2]*(0xff+1)+maskInt[3]);//将掩码的数组转换为16进制            if((maskLong|(maskLong-1))!=0xffffffff){//判断掩码判断                num[5]++;//                break;            }            if(ipInt[0]==10                    ||(ipInt[0]==172&&ipInt[1]>=16&&ipInt[1]<=31)                    ||(ipInt[0]==192&&ipInt[1]==168)){                num[6]++;                //break;不能break,因为它和num[0有重合部分]            }            if(ipInt[0]>=1&&ipInt[0]<=126){                num[0]++;                break;            }else if(ipInt[0]>=128&&ipInt[0]<=191){                num[1]++;                break;            }else if(ipInt[0]>=192&&ipInt[0]<=223){                num[2]++;                break;            }else if(ipInt[0]>=224&&ipInt[0]<=239){                num[3]++;                break;            }else if(ipInt[0]>=240){                num[4]++;                break;            }        }    }}
阅读全文
0 0
原创粉丝点击