IP的计算-HDUoj2206

Problem Description
在网络课程上,我学到了很多有关IP的知识。IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如192.168.100.16,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
但是粗心的我,常常将IP地址写错,现在需要你用程序来判断。
 

Input
输入有多个case,每个case有一行,不超过100个字符。
 

Output
对于每个case,判断输入的IP是否正确,如果正确输入YES,否则NO。
 

Sample Input
 
  
192.168.100.16
 
Sample Output
 
  
YES
 

Author

wangye


思路解析:合法的IP应满足以下几个条件:

1、字符仅仅包括0-9和‘.’。
2、有且仅仅有3个‘.’。
3、每格数字最多3位且不超过255;
4、两个‘.’不能连在一起;

5、第一个字符和最后一个字符均不是‘.’;【最后一个字符不判断也能通过,可能是oj测试数据有bug】

6、字符串长度不能超过15位(即每格最多包含三个数字,四格数字12个字符再加三个'.',一共15个字符,如“168.168.168.168”,这就是最长的了)【这一项不判断也能通过,可能是oj测试数据有bug】

代码示例一:利用C++,定义字符串变量求解

#include<bits/stdc++.h>
using namespace std;
bool ip_jud(string ip)
{
    int len=ip.size(),i,a,j,e;
    len--;
    if(ip[0]=='.'||ip[len]=='.'||len>15)//第一个字符和最后一个字符不能是'.',长度不能超过15位
    {
        return 0;
    }
    a=j=0,e=1;
    for(i=len;i>=0;i--)
    {
        if(ip[i]=='.')
        {

        }
        else if(ip[i]>='0'&&ip[i]<='9')
        {

        }
        else//不能包含'.'、'0'~'9'之外的其他字符
        {
            return 0;
        }
        if(ip[i]=='.'&&ip[i+1]=='.')//两个'.'不能连续
        {
            return 0;
        }
        if(ip[i]=='.')
        {
            a++;
            e=1;
            j=0;
        }
        else
        {
            j+=(ip[i]-'0')*e;
            e*=10;
            //cout<<j<<endl;
            if(j>255)//数字值不能大于255
            {
                return 0;
            }
        }
    }
    if(a!=3)//'.'的数量必须是三个
    {
        return 0;
    }
    return 1;//若以上没有返回假,则返回真
}
int main()
{
    string ip;
    while(getline(cin,ip))//输入可能有空格
    {
        if(ip_jud(ip))
        {
            cout<<"YES";
        }
        else
        {
            cout<<"NO";
        }
        cout<<endl;
    }
}

代码示例二:完全的C语言代码【刚开始写的代码,没有判断第六项和第五项中的最后一个字符,也能通过测试,可能是oj测试数据有bug,若读者发现提交之后错误,可能是oj测试数据进行了修改】

#include<stdio.h>
#include<string.h>
#include<math.h>
int ij(char c[])
{
    int len,i,f=0,r=1,t,p,f2;
    len=strlen(c);
    for(i=0;i<len;i++)
    {
        if(c[0]=='.')
        {
            r=0;
        }
        if(c[i]=='.'&&c[i+1]=='.')
        {
            r=0;
        }
        if(c[i]=='.')
        {
            f++;
        }
        if((c[i]>='0'&&c[i]<='9')||c[i]=='.')
        {

        }
        else
        {
            r=0;
        }
    }
    if(f==3)
    {

    }
    else
    {
        r=0;
    }
    p=1;
    t=0;
    for(i=len-1;i>=0;i--)
    {
        if(c[i]=='.')
        {
            t=0;
            p=1;
        }
        else
        {
            t=(c[i]-'0')*p+t;
            p*=10;
            if(t>255)
            {
                r=0;
            }
        }
        //printf("t=%d\n",t);
    }
    f2=0;
    for(i=0;i<len;i++)
    {
        if(c[i]=='.')
        {
            f2=0;
        }
        else
        {
            f2++;
        }
        if(f2>3)
        {
            r=0;
        }
    }
    return r;
}
int main()
{
    char c[106];
    while(gets(c))//输入可能有空格
    {
        if(ij(c))
        {
            printf("YES");
        }
        else
        {
            printf("NO");
        }
        putchar(10);
    }
}

猜你喜欢

转载自blog.csdn.net/coco56/article/details/79342585