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地址串中没有空格出现(由于要表示成一个32数字)。

可是粗心的我。经常将IP地址写错,如今须要你用程序来推断。

Input

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

Output

对于每一个case,推断输入的IP是否正确。假设正确输入YES,否则NO。

Sample Input

192.168.100.16

Sample Output

YES

IP地址应该满足例如以下条件:

1.  ‘.‘有且仅仅能有3个

2.  4个放数字的位置,长度应该在1~3之间(含边界)

3.  每一个数字应该:1~255(含边界)

4.  不能有特殊字符

比較坑的地方就是。输入居然会有空格!

用scanf就不行了。

代码例如以下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char s[117];
int flag;
int len;
int place[17];
int k;
void judge1(char st[])//推断是否每一个数字段的个数在1——3之间。

{
    if(len > 15 || len < 7)
        flag = 1;
}
void judge2(char st[])//推断是否有且仅有三个‘.‘。
{
    int cont = 0;
    int i;
    for(i = 0; i < len; i++)
    {
        if(st[i] == ‘.‘)
        {
            cont++;
            place[k] = i;
            k++;
        }
    }
    if(cont != 3)
        flag = 1;
    place[k] = i;
    k++;
}
void judge3(char st[])//推断是否有特殊字符。
{
    for(int i = 0; i < len; i++)
    {
        if(!(st[i]==‘.‘ || (st[i]>=‘0‘&&st[i]<=‘9‘)))
        {
            flag = 1;
            break;
        }
    }
}
void judge4(char st[])//推断是否每一个数字段的大小在1——255之间(含边界)。
{
    for(int i = 1; i < k; i++)
    {
        int tt = 0;
        for(int j = place[i-1]+1; j < place[i]; j++)
        {
            tt = tt*10+(st[j]-‘0‘);
        }
        if(tt > 255)
        {
            flag=1;
            break;
        }
    }
}
int main()
{
    while(gets(s))
    {
        //换为scanf直接WA
        memset(place,0,sizeof(place));
        place[0] = -1;
        flag = 0;
        k = 1;
        len = strlen(s);
        judge1(s);
        if(flag)
        {
            printf("NO\n");
            continue;
        }
        judge2(s);
        if(flag)
        {
            printf("NO\n");
            continue;
        }
        judge3(s);
        if(flag)
        {
            printf("NO\n");
            continue;
        }
        judge4(s);
        if(flag)
        {
            printf("NO\n");
            continue;
        }
        printf("YES\n");
    }
    return 0;
}
时间: 2024-10-10 23:13:39

HDU 2206 IP的计算(字符串处理)的相关文章

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 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=='

[ACM] hdu 1228 A+B (字符串处理)

A + B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11543    Accepted Submission(s): 6699 Problem Description 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. Input 测试输入包含若干测试用例,每个测试用例占一行,

【JavaScript】计算字符串的长度

定义: functionGetChineseCount(str) { varchinieseCount=0; varbadChar="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; badChar+="abcdefghijklmnopqrstuvwxyz"; badChar+="0123456789"; badChar+=""+" ";//半角与全角空格 badChar+="`[emai

C# 计算字符串的哈希值(MD5、SHA)

一.关于本文 本文中是一个类库,包括下面几个函数: 1)计算32位MD5码(大小写):Hash_MD5_32 2)计算16位MD5码(大小写):Hash_MD5_16 3)计算32位2重MD5码(大小写):Hash_2_MD5_32 4)计算16位2重MD5码(大小写):Hash_2_MD5_16 5)计算SHA-1码(大小写):Hash_SHA_1 6)计算SHA-256码(大小写):Hash_SHA_256 7)计算SHA-384码(大小写):Hash_SHA_384 8)计算SHA-512

HDU 2476 String painter(字符串转变)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题意:给定两个长度相同的串A和B.每次操作可以将A的连续一段改变为另一个字母.求将A转换成B最少需要多少次操作? 思路:首先,我们假设没有A串,那么这就跟 BZOJ1260是一样的了,即答案为DFS(0,n-1)...但是这里有了A串就有可能使得操作次数更少.因为可能有些对应位置字母是相同的.我们设 ans[i]表示前i个字母变成一样的,那么若A[i]=B[i]则ans[i]=ans[i-1]

栈的应用--计算字符串表达式

计算机的本质工作就是做数学运算,那计算机可以读入字符串"1+2+3+4+5+6+7"并计算值吗? 答案是肯定的. 这里我基本实现了个位数的加减乘除,当然这个算法最简单的解决方式是采用二叉树(后面会实现~),这里作出了栈的实现方式. 首先引入两个概念: 中缀表达式和后缀表达式 1,在生活中我们通常书写1+1的时候都会写成1+1,废话~,这就是中缀表达式,更符合人们的思维习惯与想法. 2,所谓后缀表达式就是将运算符写在操作数的后面,这样更符合计算机的思维. 举例: 5 + 3       

HDU 2617 Happy 2009(字符串)

Happy 2009 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2394    Accepted Submission(s): 802 Problem Description No matter you know me or not. Bless you happy in 2009. Input The input contain

poj 1226 hdu 1238 Substrings 求若干字符串正串及反串的最长公共子串 2002亚洲赛天津预选题

题目:http://poj.org/problem?id=1226 http://acm.hdu.edu.cn/showproblem.php?pid=1238 其实用hash+lcp可能也可以,甚至可能写起来更快,不过我没试,我最近在练习后缀数组,所以来练手 后缀数组的典型用法之一----------------后缀数组+lcp+二分 思路:1.首先将所有的字符串每读取一个,就将其反转,作为一组,假设其下标为i到j,那么cnt[i]到cnt[j]都标记为一个数字(这个数字意思是第几个读入的字符