首页 > 代码库 > IP的计算------HDOJ杭电2206(写完脑洞大开,想象力要足够丰富)
IP的计算------HDOJ杭电2206(写完脑洞大开,想象力要足够丰富)
Problem Description
在网络课程上,我学到了很多有关IP的知识。IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如192.168.100.16,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
但是粗心的我,常常将IP地址写错,现在需要你用程序来判断。
但是粗心的我,常常将IP地址写错,现在需要你用程序来判断。
Input
输入有多个case,每个case有一行,不超过100个字符。
Output
对于每个case,判断输入的IP是否正确,如果正确输入YES,否则NO。
Sample Input
192.168.100.16
Sample Output
YES
这题真的真的真的是超级挑战一个人的想象力!!!!!!
写完已跪!!!!!!
总结一下:
1.首先不能有空格
2.然后要有三个小数点
3.开头和结尾不能有小数点
4.小数点不能连续
5.两个小数点间的数字不能超过255,可以等于255,因为是2的8次方,是256,但是计数从0开始,所以最大只有255
6.举几个例子:
000.000.000.000
YES
0.0.0.0
YES
010.00.00.00
YES
255.256.255.255
NO
自己看看这几组过了没有
但是有一种情况我没有考虑,但是代码AC了,测试数据应该没有这种情况,所以我不敢判断对错
0000.0.0.0
这有一个区间的位数大于3,根据题意也没法推断出对错,所以就放着吧,反正测试数据没有这样的例子。
其实这种脑洞大开的题目杭电真的好多,最近一直在找。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; #define maxn 10000 + 6 char six[maxn]; char xp[maxn]; int liu[maxn]; int calcu(char s[]) { int len=strlen(s); int sum=0; for(int i=0;i<len;i++) { sum=sum*10+(s[i]-'0'); } return sum; } int main() { int i,j,k; int t,n,m; int a,b,c; while(gets(six)!=NULL) { int len=strlen(six); if(len<7||len>15) ///最小和最大长度 { printf("NO\n"); continue; } if(six[0]=='.'||six[len-1]=='.') ///判断头尾有无dot { printf("NO\n"); continue; } int flag=1; for(i=0;i<len;i++) ///判断有无空格 { if(six[i]==' ') { flag=0; break; } } if(flag==0) { printf("NO\n"); continue; } for(i=0;i<len;i++) ///判断是否有除dot外非数字的字符 { if((six[i]<'0'||six[i]>'9')&&six[i]!='.') { flag=0; break; } } if(flag==0) { printf("NO\n"); continue; } m=0; for(i=0;i<len;i++) ///找到dot个数 { if(six[i]=='.') m++; } if(m!=3) { printf("NO\n"); continue; } m=0; for(i=0;i<len;i++) ///找到dot位置 { if(six[i]=='.') liu[m++]=i; } /**if(liu[0]>3||len-1-liu[2]>3) { printf("NO\n"); continue; } if(liu[1]-liu[0]>4||liu[1]-liu[0]==1||liu[2]-liu[1]>4||liu[2]-liu[1]==1) { printf("NO\n"); continue; }*/ char l1[6]={},l2[6]={},l3[6]={},l4[6]={}; flag=0; for(i=0;i<liu[0];i++) { l1[flag++]=six[i]; } flag=0; for(i=liu[0]+1;i<liu[1];i++) { l2[flag++]=six[i]; } flag=0; for(i=liu[1]+1;i<liu[2];i++) { l3[flag++]=six[i]; } flag=0; for(i=liu[2]+1;i<len;i++) { l4[flag++]=six[i]; } ///printf("%s\n",six); ///printf("%d %d %d\n",liu[0],liu[1],liu[2]); ///printf("%s\n%s\n%s\n%s\n",l1,l2,l3,l4); flag=0; if(calcu(l1)>255||calcu(l2)>255||calcu(l3)>255||calcu(l4)>255) flag=1; if(flag) { printf("NO\n"); continue; } printf("YES\n"); } return 0; }
IP的计算------HDOJ杭电2206(写完脑洞大开,想象力要足够丰富)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。