UVA 1590 IP Networks(模拟)

输入一堆IP地址
取出最长的公共前缀:
对这堆IP地址做且运算得到s,
枚举n从0-32
然后把IP地址和s截断前32-n位作比较作比较

网络地址:
网络掩码:前32-n位=最长公共前缀长度

每一个IP地址和网络地址做异或,检查1出现的位置,从左往右数出现的越迟,说明公共前缀越长,IP网络就越小
求出网络掩码0的个数,然后把s前面非0的位置保留,剩下的位置填充为0

模拟:字符转数字,数字转字符

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char all[1005][35];
int main()
{
    //#define LOCAL
    #ifdef LOCAL
    freopen("in","r",stdin);
    freopen("out","w",stdout);
    #endif
    int net[4];
    int m;
    char s[100];
    int cnt , len , sum;
    int i,j,n,k;
    while(cin>>m){
        for(i=0;i<4;i++) net[i] = 255;
        for(i=0;i<m;i++){
            cin>>all[i];
            len = strlen(all[i]);
            cnt = 0 ;
            sum = 0;
            for(j=0;j<=len;j++){
                if(all[i][j]=='.'||all[i][j]=='\0'){
                    net[cnt]&=sum;
                    sum = 0;
                    cnt++;
                }else{
                    sum = sum*10+all[i][j]-48;
                }
            }
        }

        int first = 1;
        /*
        for(i=0;i<4;i++){
            if(first) first = 0;
            else cout<<".";
            cout<<net[i];
        }
        cout<<endl;
        */
        //最长 公共前缀
        int t[4];
        int ans = -1;
        for(i=0;i<m;i++){
            len = strlen(all[i]);
            cnt = 0;
            sum = 0;
            for(j=0;j<=len;j++){
                if(all[i][j]=='.'||all[i][j]=='\0'){
                    t[cnt] = net[cnt]^sum;
                    sum = 0;
                    cnt++;
                }else{
                    sum = sum*10+all[i][j]-48;
                }
            }
            for(j=0;j<4;j++){
                if(t[j]) break;
            }
            //for(j=0;j<4;j++) cout<<t[j]<<" ";cout<<endl;
            //n=0;
            if(j==4) n=0;
            else{
                if(j==3) n=0;
                else n = (3-j)*8;
                for(k=7;k>=0;k--){
                    if(t[j]&(1<<k)) break;
                }
                n+=k+1;
            }
            //cout<<"n:"<<n<<endl;
            if(n>ans) ans = n;
        }
        //保留s的前32-ans位
        int f=0,number;
        cnt=0;
        for(i=0;i<32;i++){
            if(i>=0&&i<32-ans) number = 1;
            else number = 0;
            sum = sum*2+number;
            cnt++;
            if(cnt==8){
                net[f] &= sum;
                f++;
                sum=0;
                cnt=0;
            }
        }
        first = 1;
        for(i=0;i<4;i++){
            if(first) first = 0;
            else cout<<".";
            cout<<net[i];
        }
        cout<<endl;

        //cout<<ans<<endl;
        if(ans==0) cout<<"255.255.255.255"<<endl;
        else{
            for(i=0;i<32-ans;i++) s[i] = '1';
            for(i=32-ans;i<32;i++) s[i] = '0';
            s[i] = '\0';
            cnt = 0;
            first = 1;
            for(i=0;i<32;i++){
                sum = sum*2+s[i]-'0';
                cnt++;
                if(cnt==8){
                    if(first) first = 0;
                    else cout<<".";
                    cout<<sum;
                    cnt = 0;
                    sum = 0;
                }
            }
            cout<<endl;
        }
    }
    return 0;
}
/*
Input
2
0.0.0.0
255.255.255.255
2
1.1.1.1
1.1.1.1
2
1.2.3.4
1.2.3.12
Output
0.0.0.0
0.0.0.0
1.1.1.1
255.255.255.255
1.2.3.0
255.255.255.240
*/

 

posted @ 2019-06-15 10:54  fanyuheng  阅读(86)  评论(0)    收藏  举报