HDU 2206 IP的计算【经典题】
2018-03-12 20:39
405 查看
题目链接
1.该IP中’.’的个数必须为3个
2.除去’.’之外的四部分必须全部为数字,不能够为其他的字符,且数字的范围必须在0~255之间
3.IP的首位一定不能够为’.’
4.”0000”这种情况虽然转换为数字为0,但是这是不合法的,也就是说我们要保证数字必须为三位及以下
5.不能够出现连续的两个’.’
特别要注意的一点就是,我们读入IP的时候要用gets来读取,如果直接用scanf,那么中间如果存在空格他就将你输入的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; }
相关文章推荐
- HDU 2206 IP的计算
- HDU 2206 - IP的计算
- hdu-2206-Ip的计算
- hdu-2206-ip的计算
- hdu 2206 IP的计算(最全的注意事项)
- hdu 2206 ip的计算
- HDU-2206 IP的计算 简洁AC
- HDU——2206 IP的计算
- hdu 2206IP的计算(sscanf的使用 & 字符串判断处理)
- HDU 2206 IP的计算(字符串处理)
- HDU--2206 -- IP的计算 [正则表达式]
- IP计算_hdu_2206
- HDU 2206 IP的计算 WA
- HDU 2206 IP的计算 字符串
- HDU 2206-IP的计算
- HDU 2206 IP的计算(模拟题目)
- hdu 2206 IP的计算(模拟)
- HDU 2206 IP的计算 比较坑
- hdu 2206 IP计算
- hdu 2206 IP的计算