[UVA 1590 --- IPネットワーク]ビットコンピューティング

[UVA 1590 --- IPネットワーク]ビットコンピューティング

トピック出典:入力するようにクリックして、[UVA 1590 - IPネットワーク]

説明

アレックスは、IPネットワークの管理者です。彼のクライアントは、個々のIPアドレスの束を持っているし、彼はこれらすべてのIPアドレス可能な最小のIPネットワークにグループ化を決めました。

各IPアドレスは、小数のドットで区切られた表記「byte0.byte1.byte2.byte3」(引用符は、明確にするために追加される)にバイト単位で書き込まれる4バイトの数です。各バイトは、余分な先行ゼロなし(包括的)0から255まで進数として書かれています。

ネットワークアドレス及びネットワークマスク - IPネットワークは、2つの4バイト数で記述されます。両方のネットワークアドレス及びネットワークマスクは、IPアドレスと同じ表記で書かれています。

ネットワークアドレスとネットワークマスクの意味を理解するためには、彼らのバイナリ表現を考慮する必要があります。バイト2のために8ビットが続く、BYTE1のために8ビットが続く、そしてBYTE3 8ビットに続く、BYTE0 8ビット(最下位に最も重要):IPアドレス、ネットワークアドレス、およびネットワークマスクのバイナリ表現は、32ビットで構成され。

nは1に設定された第1のビット、及びnはそのバイナリ表現にゼロに設定された最後のビット - IPネットワークは0≤N≤32にネットワーク32を有する常にマスク2N IPアドレスの範囲を含んでいます。そのバイナリ表現にゼロに設定された最後のビットをN個の第1ビットと、n - ネットワークアドレスが32の任意を有しています。IPネットワークは、その32すべてのIPアドレスが含まれてい - n個の第1ビットは32に等しく、 - nは任意のN最後のビットのネットワークアドレスの最初のビット。私たちは、それは少数のIPアドレスが含まれている場合は、1つのIPネットワークは、他のIPネットワークよりも小さいことを言います。

たとえば、ネットワークアドレス194.85.160.176とネットワークマスク255.255.255.248を持つIPネットワークは、194.85.160.183(包括的)に194.85.160.176から8つのIPアドレスが含まれています。

入力

後述するように、入力ファイルは、それらのそれぞれを、いくつかのテストケースが含まれています。

入力ファイルの最初の行は、単一の整数の数m(1≤M≤1000)を含んでいます。以下のm行は、1行に1つのアドレスをIPアドレスが含まれています。各IPアドレスは、複数の入力ファイルに何度も表示されることがあります。

出力

各テストケースのために、出力ファイルへの書き込み、入力ファイルからのすべてのIPアドレスが含まれている最小の可能なIPネットワークを記述する二行。二行目の1行目とネットワークマスク上の書き込みのネットワークアドレス。

サンプル入力

3
194.85.160.177
194.85.160.183
194.85.160.178

サンプル出力

194.85.160.176
255.255.255.248

問題解決のためのアイデア

サブネットマスクは、IPの部分を予め決定することができるので、我々は、最初のサブネットマスクを求めて質問の意味よります。
まず、32-nビットで同じIPアドレスを見つけます。対応する32-nが前に1ビットのサブネットマスクです。NATURAL後ろnビットのサブネットマスクは0です。
その後、我々は、単にIPとサブネットごとの位相(&)は、IPを見つけることができますをマスクする必要があります。

ACコード:

#include <stdio.h>
#include <string.h>
const int MAXN = 1e3+5;
int mask[4],arr_ip[MAXN][4],ip[4];
int arr_mask[9]={255,254,252,248,240,224,192,128,0};

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(mask,0,sizeof(mask));
        memset(ip,0,sizeof(ip));
        for(int i=0;i<n;i++)
            scanf("%d.%d.%d.%d",&arr_ip[i][0],&arr_ip[i][1],&arr_ip[i][2],&arr_ip[i][3]);
        for(int i=0;i<4;i++)
        {
            int mi=0x3f3f3f3f,mx=0;
            for(int j=0;j<n;j++)
            {
                if(mi>arr_ip[j][i]) mi=arr_ip[j][i];
                if(mx<arr_ip[j][i]) mx=arr_ip[j][i];
            }
            int x=mx^mi,ix;
            for(int j=0;j<=8;j++)
                if(!(x>>j)) { ix=j; break;}
            mask[i]=arr_mask[ix];
            if(mask[i]!=255) break;
        }
        for(int i=0;i<4;i++)
            ip[i]=arr_ip[0][i]&mask[i];
        printf("%d.%d.%d.%d\n",ip[0],ip[1],ip[2],ip[3]);
        printf("%d.%d.%d.%d\n",mask[0],mask[1],mask[2],mask[3]);
    }
    return 0;
}
发布了412 篇原创文章 · 获赞 135 · 访问量 4万+

おすすめ

転載: blog.csdn.net/qq_41879343/article/details/104268620