首页 > 代码库 > IP的计算------HDOJ杭电2206(写完脑洞大开,想象力要足够丰富)

IP的计算------HDOJ杭电2206(写完脑洞大开,想象力要足够丰富)

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
 
这题真的真的真的是超级挑战一个人的想象力!!!!!!
写完已跪!!!!!!
总结一下:
1.首先不能有空格
2.然后要有三个小数点
3.开头和结尾不能有小数点
4.小数点不能连续
5.两个小数点间的数字不能超过255,可以等于255,因为是2的8次方,是256,但是计数从0开始,所以最大只有255
6.举几个例子:
000.000.000.000
YES
0.0.0.0
YES
010.00.00.00
YES
255.256.255.255
NO
自己看看这几组过了没有
但是有一种情况我没有考虑,但是代码AC了,测试数据应该没有这种情况,所以我不敢判断对错
0000.0.0.0
这有一个区间的位数大于3,根据题意也没法推断出对错,所以就放着吧,反正测试数据没有这样的例子。
其实这种脑洞大开的题目杭电真的好多,最近一直在找。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

#define maxn 10000 + 6
char six[maxn];
char xp[maxn];
int liu[maxn];

int calcu(char s[])
{
    int len=strlen(s);
    int sum=0;
    for(int i=0;i<len;i++)
    {
        sum=sum*10+(s[i]-'0');
    }
    return sum;
}

int main()
{
    int i,j,k;
    int t,n,m;
    int a,b,c;
    while(gets(six)!=NULL)
    {
        int len=strlen(six);
        if(len<7||len>15)                       ///最小和最大长度
        {
            printf("NO\n");
            continue;
        }
        if(six[0]=='.'||six[len-1]=='.')        ///判断头尾有无dot
        {
            printf("NO\n");
            continue;
        }
        int flag=1;
        for(i=0;i<len;i++)                      ///判断有无空格
        {
            if(six[i]==' ')
            {
                flag=0;
                break;
            }
        }
        if(flag==0)
        {
            printf("NO\n");
            continue;
        }
        for(i=0;i<len;i++)                      ///判断是否有除dot外非数字的字符
        {
            if((six[i]<'0'||six[i]>'9')&&six[i]!='.')
            {
                flag=0;
                break;
            }
        }
        if(flag==0)
        {
             printf("NO\n");
             continue;
        }
        m=0;
        for(i=0;i<len;i++)                      ///找到dot个数
        {
            if(six[i]=='.')
                m++;
        }
        if(m!=3)
        {
            printf("NO\n");
            continue;
        }
        m=0;
        for(i=0;i<len;i++)                      ///找到dot位置
        {
            if(six[i]=='.')
                liu[m++]=i;
        }
        /**if(liu[0]>3||len-1-liu[2]>3)
        {
            printf("NO\n");
            continue;
        }
        if(liu[1]-liu[0]>4||liu[1]-liu[0]==1||liu[2]-liu[1]>4||liu[2]-liu[1]==1)
        {
            printf("NO\n");
            continue;
        }*/
        char l1[6]={},l2[6]={},l3[6]={},l4[6]={};
        flag=0;
        for(i=0;i<liu[0];i++)
        {
            l1[flag++]=six[i];
        }
        flag=0;
        for(i=liu[0]+1;i<liu[1];i++)
        {
            l2[flag++]=six[i];
        }
        flag=0;
        for(i=liu[1]+1;i<liu[2];i++)
        {
            l3[flag++]=six[i];
        }
        flag=0;
        for(i=liu[2]+1;i<len;i++)
        {
            l4[flag++]=six[i];
        }
        ///printf("%s\n",six);
        ///printf("%d %d %d\n",liu[0],liu[1],liu[2]);
        ///printf("%s\n%s\n%s\n%s\n",l1,l2,l3,l4);
        flag=0;
        if(calcu(l1)>255||calcu(l2)>255||calcu(l3)>255||calcu(l4)>255)
            flag=1;
        if(flag)
        {
            printf("NO\n");
            continue;
        }
        printf("YES\n");
    }
    return 0;
}

IP的计算------HDOJ杭电2206(写完脑洞大开,想象力要足够丰富)