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 }