首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。