华为笔试:识别有效IP地址并进行分类

题目描述
请解析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就是一个非法的掩码)
输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。

输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
//
//
//
这是华为某年的一道笔试题,今天得闲写了一下,实现代码如下

#include
#include
int fun(int n)
{
    if(n==254||n==252||n==248||n==240||n==224||n==192||n==128||n==0)
        return 1;
    else 
        return 0;
}
int main()
{
    int ip[8];
    int a=0,b=0,c=0,d=0,e=0,err=0,pri=0;//分别表示A~E类IP地址个数,错误的IP地址或子网掩码个数,私有IP个数
    while(scanf("%d.%d.%d.%d~%d.%d.%d.%d",&ip[0],&ip[1],&ip[2],&ip[3],&ip[4],&ip[5],&ip[6],&ip[7])!=EOF)
    {
        int num=0,tmp=0;
        for(int i=0;i<8;i++)
        {
            if(ip[i]>=0&&ip[i]<=255)
                           num++;
        }
        if(num<8)//ip地址和子网掩码每个数都要[0,255]
            err++;
        else
        {
            if(ip[4]==0||ip[7]==255)//0.x.x.x或x.x.x255均为错误的子网掩码
                err++;
            else
            {
                for(int j=4;j<8;j++)
                {
                    if(ip[j]==255)
                        continue;
                    int sum=0;
                    for(int k=j+1;k<8;k++)
                    {
                        sum+=ip[k];
                    }
                    if(sum==0&&fun(ip[j]))
                        tmp=1;
                    else
                        err++;
                    break;
                }
            }
            if(tmp==1)
            {
                if(ip[0]>=1&&ip[0]<=126)
                    a++;
                else if(ip[0]>=128&&ip[0]<=191)
                    b++;
                else if(ip[0]>=192&&ip[0]<=223)
                    c++;
                else if(ip[0]>=224&&ip[0]<=239)
                    d++;
                else if(ip[0]>=240&&ip[0]<=255)
                    e++;
                if(ip[0]==10||(ip[0]==127&&ip[1]>=16&&ip[1]<=31)||(ip[0]==192&&ip[1]==168))
                    pri++;
            }
        }
        
    }
    printf("%d %d %d %d %d %d %d\n", a, b, c, d, e, err, pri);
    return 0;
}

输入例子:
10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
输出:
1 0 1 0 0 1 1

你可能感兴趣的:(编程练习)