这道题目是一道关于IP地址的题目,要深入理解这道题需要有一定的网络基础。
这道题目我第一次做的时候虽然也AC了,但代码写的比较复杂,不够精炼。近期刚刚参加了网络方面的培训,在有一定知识的基础上,又重写了这道题目。将很多步骤通过位运算(如移位,异或)进行了简化,在此贴一下前后两次的代码。
第二次代码:
1 #include <cstdio> 2 const int maxn = 1000 + 10; 3 int IPs[maxn][4]; 4 int find_firstdiff(int m){ 5 for(int i=0;i<4;i++) 6 for(int j=0;j<m;j++) 7 if(IPs[j][i]!=IPs[0][i])return i; 8 return 3; 9 } 10 void printIP(int ser,int equ,int k){ 11 int is_first=0; 12 for(int i=0;i<4;i++){ 13 if(is_first)printf(".");else is_first=1; 14 if(i==k)printf("%d",equ); 15 else if (i<k) printf("%d",ser==-1?IPs[0][i]:ser); 16 else printf("0"); 17 } 18 printf(" "); 19 } 20 int main(){ 21 int m; 22 while(scanf("%d",&m)!=EOF){ 23 for(int i = 0 ; i < m; i++) 24 scanf("%d.%d.%d.%d",&IPs[i][0],&IPs[i][1],&IPs[i][2],&IPs[i][3]); 25 int k =find_firstdiff(m); 26 int maxi=0,mini=0; 27 for(int i = 0 ; i < m ; i++){ 28 if(IPs[maxi][k] < IPs[i][k])maxi= i; 29 if(IPs[mini][k] > IPs[i][k])mini= i; 30 } 31 int c=0,t=IPs[maxi][k]; 32 if(maxi!=mini){ 33 int d = IPs[maxi][k] ^ IPs[mini][k]; 34 c=0; 35 if(!d)c=1; 36 else while(d){ 37 d/=2; 38 c++; 39 } 40 t= IPs[maxi][k] >>c <<c; 41 } 42 printIP(-1,t,k); 43 printIP(255,256-(1<<c),k); 44 } 45 return 0; 46 }
第一次代码:
1 #include <cstdio> 2 #include <cstring> 3 #define maxn 1000+5 4 int s[maxn][5]; 5 void getBit(int *s,int num){ 6 int n=7; 7 while(num){ 8 s[n--]=num%2; 9 num/=2; 10 } 11 12 } 13 int main(){ 14 int n; 15 while(scanf("%d",&n)==1){ 16 int netmask[5]={0}; 17 int ip[5]={0}; 18 int max,min; 19 for(int i=0;i<n;i++){ 20 scanf("%d.%d.%d.%d",&s[i][0],&s[i][1],&s[i][2],&s[i][3]); 21 } 22 int ok=1,same=0; 23 int k; 24 for(k=0;k<4;k++){ 25 max=s[0][k],min=s[0][k]; 26 for(int i=0;i<n;i++){ 27 if(i&&ok&&s[i][k]!=s[i-1][k]){ 28 ok=0;same=k; 29 } 30 if(s[i][k]>max)max=s[i][k]; 31 else if(s[i][k]<min)min=s[i][k]; 32 } 33 if(!ok)break; 34 ip[k]=s[0][k]; 35 netmask[k]=255; 36 } 37 int a[10]={0}; 38 int c=max^min,sum1=0,sum2=0,sp=0; 39 for(int i=0;i<8;i++){ 40 if(c>=(1<<i)&&c<(1<<(i+1))){ 41 sp=i+1;break; 42 } 43 } 44 getBit(a,min); 45 for(int i=0;i<8-sp;i++){ 46 sum1=sum1+(a[i]*(1<<(7-i))); 47 sum2+=(1*(1<<(7-i))); 48 } 49 ip[k]=sum1; 50 netmask[k]=sum2; 51 printf("%d.%d.%d.%d ",ip[0],ip[1],ip[2],ip[3]); 52 printf("%d.%d.%d.%d ",netmask[0],netmask[1],netmask[2],netmask[3]); 53 } 54 return 0; 55 }