IP的計算------HDOJ杭電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
這題真的真的真的是超級挑戰一個人的想象力!!!!!!
寫完已跪!!!!!!
總結一下:
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
#include
#include
#include
#include
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;i15) ///最小和最大長度
{
printf("NO\n");
continue;
}
if(six[0]=='.'||six[len-1]=='.') ///判斷頭尾有無dot
{
printf("NO\n");
continue;
}
int flag=1;
for(i=0;i'9')&&six[i]!='.')
{
flag=0;
break;
}
}
if(flag==0)
{
printf("NO\n");
continue;
}
m=0;
for(i=0;i3||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;i255||calcu(l2)>255||calcu(l3)>255||calcu(l4)>255)
flag=1;
if(flag)
{
printf("NO\n");
continue;
}
printf("YES\n");
}
return 0;
}