描述

请解析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范围是:

    1. 从10.0.0.0到10.255.255.255
    2. 从172.16.0.0到172.31.255.255
    3. 从192.168.0.0到192.168.255.255
  • 子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码) (注意二进制下全是1或者全是0均为非法子网掩码)

  • 注意:

    1. 类似于【0...】和【127...】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
    2. 私有IP地址和A,B,C,D,E类地址是不冲突的
  • 输入描述:

    • 多行字符串。每行一个IP地址和掩码,用~隔开。
  • 输出描述:

    • 统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
  • 示例1

    • 输入:

    • 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

    • 数字对应含义:

    • A类IP B类IP C类IP D类IP E类IP 错误IP 私有IP 的数量

    • 说明:

    • 10.70.44.68~255.254.255.0的子网掩码非法,19..0.~255.255.255.0的IP地址非法,所以错误IP地址或错误掩码的计数为2;

    • 1.0.0.1~255.0.0.0是无误的A类地址;

    • 192.168.0.2~255.255.255.0是无误的C类地址且是私有IP;

    • 所以最终的结果为1 0 1 0 0 2 1

  • 示例2

    • 输入:

    • 0.201.56.50~255.255.111.255

    • 127.201.56.50~255.255.111.255

    • 输出:

    • 0 0 0 0 0 0 0

    • 说明:

    • 类似于【0...】和【127...】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略

解题1

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String str;
        int a=0,b=0,c=0,d=0,e=0,err=0,pri=0;
        while((str=buffer.readLine())!=null){
            int index=str.indexOf('~');
            long num1=strToInt(str.substring(0,index));
            long num2=strToInt(str.substring(index+1));
            long t=num1>>24;
            if(t==0||t==127) continue;
            if(num2<=0||num2>=0XFFFFFFFFL||(((num2 ^ 0XFFFFFFFFL)+1)|num2)!=num2){
                err++;
                continue;
            }
            if(t<=0)err++;
            else if(t>=1&&t<=126){
                a++;
                if(t==10) pri++;
            }else if(t>=128&&t<=191){
                b++;
                if(num1>>20==0xAC1)pri++;
            }else if(t>=192&&t<=223){
                c++;
                if(num1>>16==0xC0A8)pri++;
            }else if(t>=224&&t<=239)d++;
            else if(t>=240&&t<=255)e++;
        }
        System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+err+" "+pri);
    }
    public static long strToInt(String str){
        char[] cs=str.toCharArray();
        long res=0,tmp=0,flag=0;
        for(char c:cs){
            if(c=='.'){
                res=res<<8|tmp;
                tmp=0;
                flag++;
            }
            else if(c>='0'&&c<='9'){
                tmp=tmp*10+c-'0';
                flag=0;
            }else{
                return -1;
            }
            if(flag>=2) return -1;

        }
        res=res<<8|tmp;
        return res;
    }
}

解题2