zoukankan      html  css  js  c++  java
  • 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("
    ");
    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 }
  • 相关阅读:
    linux 系统账户 和 普通账户 的区别
    supervisor 相关命令
    linux 动态链接库查找方法;查找动态链接库位置; LIBRARY_PATH 和 LD_LIBRARY_PATH 的区别;LD_LIBRARY_PATH and LD_RUN_PATH的区别;MACOS 下查看动态链接库方法
    Ubuntu 一键伪装成Win 10,Kali Linux 2019 kali-undercover软件嫁接;Ubuntu 1804 使用 kali-undercover;
    C 实战练习题目30 – 回文数
    C 实战练习题目29
    C 实战练习题目28
    C 实战练习题目27
    C 实战练习题目26 -递归法求阶乘
    C 实战练习题目25
  • 原文地址:https://www.cnblogs.com/Wade-/p/6305350.html
Copyright © 2011-2022 走看看