首页 > 代码库 > Uva 1590 IP Networks

Uva 1590 IP Networks

这道题目是一道关于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("\n");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\n",ip[0],ip[1],ip[2],ip[3]);52         printf("%d.%d.%d.%d\n",netmask[0],netmask[1],netmask[2],netmask[3]);53     }54     return 0;55 }

 

Uva 1590 IP Networks