[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;
}