AlenaNuna

导航

HJ18 识别有效的IP地址和掩码并进行分类统计

题意…真的…好多…让人误会的地方T_T

最大的教训就是,处理略微复杂以上的题目,一定要拆分成很多个子程序来写,不要一大堆东西扔在主程序里硬写,很容易出错还难调试。

哦,第二个教训就是一定要自己手算一下样例,搞明白题意再写题!!!不要看着题面觉得很容易就自己YY!!T_T

题目没什么好说的,思路就是对于每一个字符串,把里面的数字都拆出来。如果不等于8,就证明IP地址不是4个数或者子网掩码不是4个数,直接跳出。

然后判断一下数字范围是否在0~255.

最后就是按照题意要求进行分类什么的……细节很多,题面写得很容易让人误会,要注意。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[500];
 4 int l,cnt_num=0,sz[10],CW=0,A=0,B=0,C=0,D=0,E=0,syIP=0;
 5 int st;
 6 int IntoNum(int i){
 7     int x=0,f=1;
 8     while(s[i]<'0'||s[i]>'9'){
 9         if(s[i]=='-') f=-1;
10         i++;
11     }
12     while(s[i]>='0'&&s[i]<='9'){
13         x=x*10+s[i]-'0';
14         i++;
15     }
16     return f*x;
17 }
18 void CheckIPtype(){
19     if(sz[1]>=1&&sz[1]<=126)A++;
20     if(sz[1]>=128&&sz[1]<=191)B++;
21     if(sz[1]>=192&&sz[1]<=223)C++;
22     if(sz[1]>=224&&sz[1]<=239)D++;
23     if(sz[1]>=240&&sz[1]<=255)E++;
24     if(sz[1]==10)syIP++;
25     if(sz[1]==172&&(sz[2]>=16&&sz[2]<=31))syIP++;
26     if(sz[1]==192&&sz[2]==168)syIP++;
27     return;
28 }
29 /*void init(){
30 //    memset(sz,0,sizeof(sz));
31     cnt_num=0;
32      st=-1;
33     return;
34 }*/
35 bool CheckYM(){
36     int a[33],cnt=0,x;
37 //    memset(a,0,sizeof(a));
38     for(int i=5;i<=8;i++){
39         x=1<<7;
40         for(int j=1;j<=8;j++){
41             cnt++;
42             if(sz[i]&x) a[cnt]=1; else a[cnt]=0;
43             x>>=1;
44         }
45     }
46 //    for(int i=1;i<=32;i++) printf("%d ",a[i]);puts("");
47     if(a[1]==0)return 0;
48     for(int i=2;i<=32;i++)
49         if(a[i]==1&&a[i-1]==0) return 0;
50     if(a[32]==1)return 0;
51     return 1;
52 }
53 bool CheckIP(){
54     for(int i=1;i<=8;i++)
55         if(sz[i]<0||sz[i]>255) return 0;
56     return 1;
57 }
58 int main(){
59     while(~scanf("%s",s)){
60         cnt_num=0;
61         l=strlen(s);
62         for(int i=0;i<l;i++){
63             if(s[i]>='0'&&s[i]<='9'){
64                 if(i==0||(s[i-1]<'0'||s[i-1]>'9'))
65                 sz[++cnt_num]=IntoNum(i);
66             }
67         }
68 //        if(cnt_num==8)printf("CHECK YM:%d\n",CheckYM());
69         if(sz[1]==0||sz[1]==127)continue;
70         if(cnt_num!=8 || !CheckIP() || !CheckYM()){
71             CW++;
72             continue;
73         }
74         CheckIPtype();
75 //        if(cnt_num!=8)printf("NO!%d\n",cnt_num);
76     }
77     printf("%d %d %d %d %d %d %d",A,B,C,D,E,CW,syIP);
78     return 0;
79 }

 

posted on 2024-09-01 20:22  AlenaNuna  阅读(9)  评论(0编辑  收藏  举报