Tanky WooRSS

HDOJ 2206 IP的计算

03 Aug 2010
这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。

 

题目地址:

http://acm.hdu.edu.cn/showproblem.php?pid=2206

麻烦的模拟题~~~~

说下这题要注意的几点吧。

1.不能有除了数字和'.'以外的其他字符,不光是判断空格。

  1. '.' 的数目必须是三个

3.每2个'.'之间的数字大小是0~255

4.没2个'.'之间的数字的个数要小于等于3个,且不能是0个。

5.根据我自己的思路,在判断三个'.'时,对第四个数要额外考虑。

    考虑大小,个数等

   比如:100.110.110.   |   100.110.110.1000 |   100.110.110.333

   这些情况都是NO,都得考虑。代码有点杂。大家互相学习吧。

这里多层循环退出麻烦,我第一次用了goto~~~呵呵。

 // Author: Tanky Woo
#include 
#include 
#include 
#include 
using namespace std;

char ip[101];
int nCases;
int main()
{
T:while(gets(ip))
    {
        int len = strlen(ip);
        for(int i=0; i'9' || ip[i]<'0') && ip[i] != '.')
            {
                printf("NO\n");
                goto T;
            }
        }
        int cnt = 0;
        int num = 0;
        int num_cnt = 0;
        for(int i=0; i < len; ++i)
        {
            if(ip[len-1] == '.')   // 最后一位是'.'
            {
                printf("NO\n");
                goto T;
            }
            if(ip[i] == '.')
            {
                if((num < 0 || num > 255) || num_cnt==0 || num_cnt>3)   // 数字大于255或者位数大于3或等于0
                {
                    printf("NO\n");
                    goto T;
                }
                num = 0;
                num_cnt = 0;
                cnt++;
                continue;
            }
            num *= 10;
            num += ip[i]-'0';
            num_cnt++;
            if(i == len-1)
            {
                if((num < 0 || num > 255) || num_cnt==0 || num_cnt>3)   // 数字大于255或者位数大于3或等于0
                {
                    printf("NO\n");
                    goto T;
                }
            }
        }
        if(cnt == 3)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}