HDu 2206 IPの計算
3466 ワード
IPの計算
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2686 Accepted Submission(s): 488
Problem Description
インターネットの授業で、IPに関する多くの知識を学びました.IPのフルネームはインターネットプロトコルと呼ばれて、时には私达はまたIPで私达のIPネットワークのアドレスを指して、今IPV 4の下で1つの32ビットの符号のない整数で表して、一般的に点分けの方式で表示して、点はIPアドレスを4つの部分に分けて、各部分は8ビットで、1つの符号のない整数を表して(そのためプラス記号で现れる必要はありません)、例えば192.168.100.16、私达のとても熟知しているIPアドレスで、1つのIPアドレス列にスペースは表示されません(32数字で表すため).
しかし、不注意な私は、よくIPアドレスを書き間違えて、今あなたがプログラムで判断する必要があります.
Input
複数のcaseが入力され、各caseには100文字を超えない行があります.
Output
各caseについて,入力したIPが正しいか否かを判断し,YESが正しく入力されている場合はNOとする.
Sample Input
192.168.100.16
Sample Output
YES
Author
wangye
Recommend
wangye
簡単に見えるものには落とし穴があり、主に以下の4点に注意します:<1>検査時に先頭と接尾辞のスペースをフィルタします<2>4セグメントの数字の桁数は3ビットを超えてはいけません.例えば000.00.000.000.000.000.0000は正しいですが、 0000.000.000.000.000.000誤った<3>区切り記号点の個数は3であり、多くなっても少なくなっても<4>各セグメント値は255を超えてはならない
私のコードは、長いので、メモリを浪費していますが、まだできます.記録してください.
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2686 Accepted Submission(s): 488
Problem Description
インターネットの授業で、IPに関する多くの知識を学びました.IPのフルネームはインターネットプロトコルと呼ばれて、时には私达はまたIPで私达のIPネットワークのアドレスを指して、今IPV 4の下で1つの32ビットの符号のない整数で表して、一般的に点分けの方式で表示して、点はIPアドレスを4つの部分に分けて、各部分は8ビットで、1つの符号のない整数を表して(そのためプラス記号で现れる必要はありません)、例えば192.168.100.16、私达のとても熟知しているIPアドレスで、1つのIPアドレス列にスペースは表示されません(32数字で表すため).
しかし、不注意な私は、よくIPアドレスを書き間違えて、今あなたがプログラムで判断する必要があります.
Input
複数のcaseが入力され、各caseには100文字を超えない行があります.
Output
各caseについて,入力したIPが正しいか否かを判断し,YESが正しく入力されている場合はNOとする.
Sample Input
192.168.100.16
Sample Output
YES
Author
wangye
Recommend
wangye
簡単に見えるものには落とし穴があり、主に以下の4点に注意します:<1>検査時に先頭と接尾辞のスペースをフィルタします<2>4セグメントの数字の桁数は3ビットを超えてはいけません.例えば000.00.000.000.000.000.0000は正しいですが、 0000.000.000.000.000.000誤った<3>区切り記号点の個数は3であり、多くなっても少なくなっても<4>各セグメント値は255を超えてはならない
私のコードは、長いので、メモリを浪費していますが、まだできます.記録してください.
#include <stdio.h>
#include <string.h>
int check_num(char s[], int st, int end)
{
int i, k = 0, tag = 0;
if(end - st > 3)
return 0;
for( i = st; i < end; i++)
{
if(s[i] >= '0' && s[i] <= '9')
{
k = k * 10 + s[i] - '0';
tag = 1;
}
else
return 0;
}
if(k > 255 || tag == 0)
return 0;
//printf("k = %d
", k);
return 1;
}
int check_ip(char s[])
{
int len = strlen(s);
int st, end;
int dotp[4], ip[4];
int dn = 0;
int i, j, k, res;
for(i = 0; s[i] == ' '; i++)
; // process the backspace before number
st = i;
for(i = len - 1; s[i] == ' '; i--)
; //process the backspace after number
end = i + 1;
k = 0;
for(i = st; i < end; i++)
{
if(s[i] == '.')
{
dn++;
if(dn > 3) // more than 3, break
break;
dotp[k++] = i;
}
}
if(dn != 3) // dot number is not 3
{
return 0;
}
for(i = 0; i < 4; i++)
{
switch(i)
{
case 0:
res = check_num(s, st, dotp[0]);
break;
case 1:
case 2:
res = check_num(s, dotp[i - 1] + 1, dotp[i]);
break;
case 3:
res = check_num(s, dotp[i - 1] + 1, end);
break;
}
if(res == 0)
{
return 0;
}
}
return 1;
}
int main()
{
char s[101];
int res;
while(gets(s) != NULL)
{
res = check_ip(s);
if(!res)
printf("NO
");
else
printf("YES
");
}
return 0;
}