首页 > Web开发 > 详细

Uva 1590 IP Networks

时间:2017-01-19 07:55:20      阅读:372      评论:0      收藏:0      [点我收藏+]

这道题目是一道关于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

原文:http://www.cnblogs.com/Wade-/p/6305350.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!