HDU 2206:IP的计算

点击打开题目

/**************************************************************************
Date 2018/3/15 19:52
Author Wen Yaxin

解题思路:不合法的情况如下:
1.存在除数字和点以外的其他字符
2.出现连续点的情况
3.数字的个数不是4个或点的个数不是3个
4.数字是小于0或大于255
5.数字含有前导0.
PS:本来是个模拟水题,不想写题解,可是做了时候错了7次,
还是总结一下吧。
首先如果正向去思考,需要判断以上那么多种情况,在我WA到
吐的时候,我就想为何我不反过来想呢,因此采用逆向思维,
不再去考虑这么情况,做法如下。
直接将字符串种出现的数字求出,并存储,然后把每个数字
转化成字符串并在其后加'.',只考虑前4个数字,最后一个数字
后不加点,然后与原来的字符串进行比较(这意操作可以检测1,2,3,5),
如果相等,则再看存储的数组是否都位于0~255之间,如果符合,则再看
数字个数是否为4个,如果是,该字符串就是IP地址。

提醒一点:输入字符串用gets,因为给出的字符串可以是任意字符组成的,
会给出含有空格的字符串,如果这点不注意,会让你WA到哭。

变量含义:
str:接收输入的字符串
len:字符串的长度
a:存放字符串中连续出现的数字串转换成的整数
cnt:数字a的下标,最终为数字个数。

方法含义:
judge:判断是否为IP地址。
*********************************************************************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <string>
using namespace std;

char str[110],len;
int a[110],cnt;

bool judge() {
    string s="",ip="";
    int num = 0,cnt = 0;
    for(int i = 0; i < len; i++) {
        ip += str[i];
        if(str[i]>='0' && str[i]<='9') {
            num = num*10 + str[i]-'0';
        }
        else {
           a[cnt++] = num;
           num = 0;
        }
    }
    a[cnt] = num;
    cnt = min(cnt,3);
    for(int i = 0; i <= cnt; i++) {
        if(a[i] == 0) {
            s += '0';
        }
        else {
            string temp = "";
            while(a[i]) {
                char ch = a[i]%10 + '0';
                temp += ch;
                a[i] = a[i]/10;
            }
            for(int i = temp.length()-1; i >= 0; i--) {
                s += temp[i];
            }
        }
        s += '.';
    }
    ip += '\0';
    int sLen = s.length();
    s[sLen-1] = '\0';
    //cout<<s<<endl;
    if(s == ip) {
        num = 0;
        for(int i = 0; i < (int)s.length(); i++) {
            if(s[i]>='0' && s[i]<='9') {
                num = num*10 + s[i]-'0';
            }
            else {
                if(num>=0 && num<=255) {
                    num = 0;
                }
                else {
                    return false;
                }
            }
        }
        if(num >= 0 && num <= 255) {}
        else return false;
    }
    else {
        return false;
    }
    if(cnt < 3) return false;
    return true;
}
int main() {
    while(gets(str)) {
        len = strlen(str);
        bool flag = judge();
        if(flag) {
            printf("YES\n");
        }
        else {
            printf("NO\n");
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值