您的位置:首页 > 其它

HDU 2206 IP的计算

2018-01-28 12:18 357 查看
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

题目比价坑,存在空格 所以不能用scanf 来处理 ,只能用gets 来处理

合法的ip地址有4个条件

1. ‘.’有且只能有3个

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

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

4. 不能有特殊字符

CODE

#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[])//判断长度是否合法
{
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;
}


第二个代码:

#include <iostream>
#include <string.h>
#include <cstdio>
#include <algorithm>
using namespace std;
#include <bits/stdc++.h>

int a[500001];
int main()
{
char a[100];
while (gets(a))
{
int flag=0;
int n = strlen(a);
if (n>15 || n<7)
{
flag=1;
}
if (a[0]=='.'||a[n-1]=='.')
{
printf ("NO\n");
continue;
}
int sum=0;
int sump=0;
for (int i=0;i<n; i++)
{
if (a[i]=='.')
{
sump++;
if (sum>255)
{
flag=1;
break;
}
if (a[i+1]=='.')
{
flag=1;
break;
}
else
{
sum=0;
continue;
}
}
else
{
if (a[i]>='0'&&a[i]<='9')
{
sum =sum*10+ a[i]-'0';
}
else
{
flag=1;
break;
}
}
}
if (sum>255)
{
flag=1;
}
if (sump!=3)
flag=1;
if (flag!=1)
printf ("YES\n");
else
printf ("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: