• poj 2799 IP Networks (模拟/水题)


    题目:给你一堆ip,求他们的最小网络地址和网络掩码

    思路:找到最大的ip和最小的ip,把他们转化成二进制,从头到尾找二进制位相同的个数,最小网络地址把后面的不同的所有二进制变成0,网络掩码把前面的相同变成一

    代码:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    
    struct node
    {
        char k[35];
    } data[1005];
    
    bool cmp(node a,node b)
    {
        if(strcmp(a.k,b.k)<0) return true;
        else return false;
    }
    
    void cut(char *str,int num)
    {
        int ans=0;
        int q=8;
        int flag=1;
        for(int i=0; i<strlen(str); i++)
        {
            if(str[i]!='.')
            {
                ans=ans*10+str[i]-'0';
            }
            else
            {
                flag++;
                while(ans)
                {
                    data[num].k[q]=ans%2+'0';
                    ans=ans/2;
                    q--;
                }
                q=8*flag;
                ans=0;
            }
        }
        while(ans)
        {
            data[num].k[q]=ans%2+'0';
            ans=ans/2;
            q--;
        }
        data[num].k[33]='';
    }
    
    int main()
    {
        int m;
        char k[35];
        freopen("ip.in","r",stdin);
        freopen("ip.out","w",stdout);
        while(cin>>m)
        {
            for(int i=0; i<m; i++)
            {
                cin>>k;
                memset(data[i].k,'0',sizeof(data[i].k));
                cut(k,i);
                //cout<<data[i].k<<endl;
            }
            sort(data,data+m,cmp);
            int n=0;
            /*for(int i=0;i<m;i++)
            {
                cout<<data[i].k<<endl;
            }*/
            for(int i=1; i<=32; i++)
            {
                if(data[0].k[i]==data[m-1].k[i])
                {
                    n++;
                }
                else break;
            }
            for(int i=n+1;i<=32;i++)
            {
                data[m-1].k[i]='0';
            }
            //cout<<data[m-1].k<<endl;
            int up=128;
            int ans=0;
            for(int i=1;i<=32;i++)
            {
                ans=ans+up*(data[m-1].k[i]-'0');
                up=up/2;
                if(up==0)
                {
                    cout<<ans;
                    if(i!=32)
                    cout<<'.';
                    up=128;
                    ans=0;
                }
            }
            cout<<endl;
            for(int i=1;i<=n;i++)
            {
                data[m-1].k[i]='1';
            }
            ans=0;
            for(int i=1;i<=32;i++)
            {
                ans=ans+up*(data[m-1].k[i]-'0');
                up=up/2;
                if(up==0)
                {
                    cout<<ans;
                    if(i!=32)
                    cout<<'.';
                    up=128;
                    ans=0;
                }
            }
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    luogu P3704 [SDOI2017]数字表格
    「雅礼集训 2018 Day4」Magic(分治NTT)
    「清华集训 2017」小 Y 和恐怖的奴隶主
    [WC2019]数树(树形dp+多项式exp)
    「FJWC2020Day5-zzq」lg (容斥)
    BoundedOptimization TopCoder
    MapGuessing TopCoder
    线性递推(Berlekamp-Massey 算法)
    杜教筛小记
    「余姚中学 2019 联测 Day 6」解码
  • 原文地址:https://www.cnblogs.com/simplekinght/p/6710659.html
Copyright © 2020-2023  润新知