首页 > ACM题库 > HDU-杭电 > hdu 2206 IP的计算-字符串-[解题报告]C++
2014
01-04

hdu 2206 IP的计算-字符串-[解题报告]C++

IP的计算

问题描述 :

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

输入:

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

输出:

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

样例输入:

192.168.100.16

样例输出:

YES

字符串处理,详见代码。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=100+5;
char s[maxn];
int p[maxn];//统计.的位置
int main()
{
    while(gets(s)!=NULL)
    {
        int cnt=0;
        bool flag=true;
        for(int i=0;s[i];i++)
        {
            if(s[i]=='.') p[cnt++]=i;
            if(!(s[i]=='.'||(s[i]>='0'&&s[i]<='9'))) flag=false;//非法字符
        }
        if(p[0]>=4||p[0]==0) flag=false;//第一个.不能在第一位或第三位以后
        if(cnt!=3) flag=false;//.数量不等于3
        for(int i=1;i<=2;i++)
        {
            int t=p[i]-p[i-1];
            if(t>4||t==0) flag=false;//中间数字长度0<L<=4
        }
        int c=0;
        for(int i=0;s[i];i++)//所有出现的数字小于等于255
            if(s[i]!='.') c=c*10+s[i]-'0';
            else if(c>255) flag=false;
            else c=0;
        if(c>255) flag=false;
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

解题转自:http://blog.csdn.net/z690933166/article/details/8759844


  1. 你的理解应该是:即使主持人拿走一个箱子对结果没有影响。这样想,主持人拿走的箱子只是没有影响到你初始选择的那个箱子中有奖品的概率,但是改变了其余两个箱子的概率分布。由 1/3,1/3 变成了 0, 2/3