HJ39 判断两个IP是否属于同一子网
没啥好说的,又是模拟+一堆无聊的细节。
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[3][20]; 4 int num[3][10],cnt[3]; 5 void init(){ 6 for(int i=0;i<3;i++) 7 scanf("%s",s[i]); 8 return; 9 } 10 int Work(int a,int b){ 11 int x=0,i=a,j=b,f=1; 12 while(s[i][j]<'0'||s[i][j]>'9'){ 13 if(s[i][j]=='-')f=-1; 14 j++; 15 } 16 while(s[i][j]>='0'&&s[i][j]<='9'){ 17 x=x*10+s[i][j]-'0'; 18 j++; 19 } 20 return f*x; 21 } 22 void GetNum(){ 23 for(int i=0;i<3;i++){ 24 int l=strlen(s[i]); 25 for(int j=0;j<l;j++) 26 if(s[i][j]=='-'||(s[i][j]>='0'&&s[i][j]<='9')){ 27 if(j==0||(s[i][j-1]<'0'||s[i][j-1]>'9')){ 28 // printf("!%c",s[i][j]); 29 num[i][++cnt[i]]=Work(i,j); 30 // printf("%d ",num[i][cnt[i]]); 31 } 32 } 33 } 34 return; 35 } 36 bool Check3(){ 37 int e[40],cnt=0; 38 for(int i=1;i<=4;i++){ 39 for(int j=7;j>=0;j--){ 40 int t=1<<j; 41 cnt++; 42 if(t&num[0][i]) e[cnt]=1; 43 else e[cnt]=0; 44 } 45 } 46 if(e[1]==0||e[cnt]==1)return 0; 47 for(int i=2;i<=cnt;i++) 48 if(e[i]==1&&e[i-1]==0)return 0; 49 return 1; 50 } 51 bool Check(){ 52 for(int i=0;i<3;i++) 53 if(cnt[i]!=4)return 0; 54 for(int i=0;i<3;i++) 55 for(int j=1;j<=4;j++) 56 if(num[i][j]<0||num[i][j]>255)return 0; 57 if(!Check3())return 0; 58 return 1; 59 } 60 bool CheckZW(){ 61 for(int i=1;i<=4;i++){ 62 int a=num[1][i]&num[0][i]; 63 int b=num[2][i]&num[0][i]; 64 // printf("%d %d\n",a,b); 65 if(a!=b)return 0; 66 } 67 return 1; 68 } 69 int main(){ 70 init(); 71 // puts("OK"); 72 GetNum(); 73 if(!Check()){ 74 puts("1"); 75 return 0; 76 } 77 if(CheckZW()){ 78 puts("0"); 79 } 80 else puts("2"); 81 return 0; 82 }