HDU ACM 2206 IP的计算

一定要注意IP的长度不能超过15位。

方法一:

#include<iostream>
using namespace std;

bool f(char* p)
{
    int state,sum;

    state=sum=0;
    while(true)
    {
        switch(state)
        {
        case 0:
        case 1:
        case 2:
            if(*p==NULL) return false;
            if(*p<='9' && *p>='0' || *p=='.')
            {
                if(*p=='.')
                {
                    if(sum<0 || sum>255) return false;
                    sum=0;
                    state++;
                }
                else
                    sum=sum*10+(*p-'0');
                p++;
            }
            else return false;
            break;

        case 3:
            if(*p<='9' && *p>='0' || *p=='.' || *p==NULL)
            {
                if(*p==NULL && *(p-1)=='.')
                    return false;
                else if(*p==NULL)
                {
                    if(sum<0 || sum>255) return false;
                    return true;
                }
                else
                    sum=sum*10+(*p-'0');
                p++;
            }
            else return false;
        }
    }
    return false;
}

int main()
{
    char a[101];

    while(gets(a))
    {
        if(f(a)&& strlen(a)<=15)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

方法二:利用sscanf判断,这种方法很简单。

#include<iostream>
using namespace std;

bool r(int x)
{
    return x>=0&& x<=255?1:0;
}

int main()
{
    char ip[101];
    while(gets(ip))
    {
        int a,b,c,d;
        char tail;

        if(sscanf(ip, "%d.%d.%d.%d%c", &a, &b, &c, &d, &tail) == 4 &&!strchr(ip, '+') && strlen(ip)<=15)
        {
            if( r(a)&& r(b)&& r(c)&& r(d) )
                puts( "YES" );
            else
                puts( "NO" );
        }
        else
            puts( "NO" );
    }
    return 0;
}
时间: 2024-08-29 14:32:04

HDU ACM 2206 IP的计算的相关文章

HDU ACM 2207 IP的计算(二)

方法一:计算掩码位数有两种方法,使用LOG或位运算都可以:使用LOG要注意向上取整和+3,而不是+2,+2计算不对,通不过.换底公式log a(b)=log c(b)/log c(a):C语言只有log以e为底,log10以10为底. #include<iostream> #include<cmath> using namespace std; int GetNum(int x) { double y; y=log10(x+3)/log10(2); return (int)ceil

hdu 2206 IP的计算 模拟

IP的计算 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7980    Accepted Submission(s): 1570 Problem Description 在网络课程上,我学到了很多有关IP的知识.IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方式来

HDU 2206 IP的计算(字符串处理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2206 Problem Description 在网络课程上,我学到了非常多有关IP的知识. IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,如今IPV4下用一个32位无符号整数来表示,一般用点分方式来显示.点将IP地址分成4个部分.每一个部分为8位.表示成一个无符号整数(因此不须要用正号出现),如192.168.100.16,是我们非常熟悉的IP地址.一个IP地址串中没有空格出现(由于

HDU ACM 1005 Number Sequence

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 119732    Accepted Submission(s): 29072 Problem Description A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A

hdu acm 1166 敌兵布阵 (线段树)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 37903    Accepted Submission(s): 15985 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

杭电OJ(HDU)-ACM Steps-Chapter Two-《Biker&#39;s Trip Odometer》《Climbing Worm》《hide handkerchief》《Nasty Hac》

1.2.1 Biker's Trip Odometer #include<stdio.h> #include<math.h> const double PI=acos(-1.0); /* 计算题,根据公式做就行,PI*d*r/(12*5280);res1/t*3600; Sample Input 26 1000 5 27.25 873234 3000 26 0 1000 Sample Output Trip #1: 1.29 928.20 Trip #2: 1179.86 1415

HDU ACM 1103 Flo&#39;s Restaurant

分析:借助STL的min_element实现.每次更新最先被占用的桌子,具体见注释. #include<iostream> #include<algorithm> using namespace std; int main() { int A,B,C; char s[10]; int a[102],b[102],c[102]; int curtime,count,ans; int *p; //桌子最先空闲时间 while(cin>>A>>B>>C

hdu acm 1425 sort(哈希表思想)

sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25803    Accepted Submission(s): 7764 Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且

HDU ACM 1025 Constructing Roads In JGShining&amp;#39;s Kingdom-&amp;gt;二分求解LIS+O(NlogN)

#include<iostream> using namespace std; //BFS+优先队列(打印路径) #define N 500005 int c[N]; int dp[N]; //dp[i]保存的是长度为i的最长不降子序列的最小尾元素 int BS(int n,int x) //二分查找下标,当x比全部元素小时下标为1,比全部元素大时下标为n+1. { int low,high,mid; low=1,high=n; while(low<=high) { mid=(low+h