HDU 2206 IP的计算【经典题】

题目链接

题目意思

给你一串IP,判断它在IPV4下是否合法。

解题思路

我们分析一下IP合法的情况:
1.该IP中’.’的个数必须为3个
2.除去’.’之外的四部分必须全部为数字,不能够为其他的字符,且数字的范围必须在0~255之间
3.IP的首位一定不能够为’.’
4.”0000”这种情况虽然转换为数字为0,但是这是不合法的,也就是说我们要保证数字必须为三位及以下
5.不能够出现连续的两个’.’
特别要注意的一点就是,我们读入IP的时候要用gets来读取,如果直接用scanf,那么中间如果存在空格他就将你输入的IP当做两个来处理了,所以我做的时候一直错,找错找到心态爆炸。。。

代码部分

先来一个我自己写的代码,就是将所有情况考虑之后来写的。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#define ll long long
using namespace std;
bool isNum(char a)///判断是否为数字
{
    if(a>='0'&&a<='9')
        return true;
    else
        return false;
}
bool isHe(char a[])
{
    int n=strlen(a);
    if(a[n - 1] == '.')///如果最后一位为.是不合法的
        return false;
    int j=0;///j用来记录总的点数。
    int b[5] = {0};///数组b用来记录IP每位上的数字
    int numCount=0,dotNum=0;///numCount表示数字个数,dotNum表示点数
    for(int i=0; i<n; i++)
    {
        if(isNum(a[i]))
        {
            b[j]=b[j]*10+(int)(a[i]-'0');
            numCount++;
            if(numCount>3)
                return false;
            dotNum=0;
        }
        else if(a[i]=='.')
        {
            j++;
            dotNum++;
            numCount=0;
            if(i==0)///如果首位为.说明IP不合法
                return false;
            if(dotNum>1)///如果有两位连续的.IP也是不合法的
                return false;
        }
        else
            return false;
    }
    if(j!=3)///IP中的总点数不为3,IP不合法
        return false;
    for(int i=0; i<4; i++)
        if(b[i]<0||b[i]>255)
        return false;
    return true;
}

int main()
{

    char s[105];
    while(gets(s))///这里要用gets读入字符串,这样才能吞空格
    {
        if(isHe(s))
            printf("YES\n");
        else
            printf("NO\n");

    }
    return 0;
}

后来我又发现一个比较简单的代码,我们可以看看,用这种方式写要省很多的力气哦。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#define ll long long
using namespace std;

int main()  
{  
    char s[105],h[105];  
    int c1,c2,c3,c4;  
    while(gets(s))  
    {  
        sscanf(s,"%d.%d.%d.%d",&c1,&c2,&c3,&c4);///以.分割字符串分别存入c1,c2,c3,c4中,以int类型存入  
        if((c1>=0&&c1<=255)&&(c2>=0&&c2<=255)&&(c3>=0&&c3<=255)&&(c4>=0&&c4<=255))///判断每个字段是否符合条件  
        {  
            sprintf(h,"%d.%d.%d.%d",c1,c2,c3,c4);///将c1,c2,c3,c4中间以.相接拼接成字符串存入字符串h中  
            if(strcmp(s,h)==0)///比较字符串s和h是否相等  
                printf("YES\n");  
            else  
                printf("NO\n");  
        }  
        else  
            printf("NO\n");  
    }  
    return 0;  
}  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值