Sample Input
3
194.85.160.177
194.85.160.183
194.85.160.178
Sample Output
194.85.160.176
255.255.255.248
C++代码:
#include<stdio.h>
#include <cstring>
#include <algorithm>
#include<assert.h>
#define _for(i,a,b) for( int i=(a); i<(b); ++i)
#define _rep(i,a,b) for( int i=(a); i<=(b); ++i)
using namespace std;
bool inRange(int x,int left,int right){
if(left>right)
return inRange(x,right,left);
return left<=x&&x<=right;
}
const int w=8,IPW=4*w;
void printIP(const int *v){
bool first=true;
_for(i,0,4){
int x=0;
_for(j,i*w,(i+1)*w) x=(x<<1)|v[j];
if(first)
first=false;
else
printf(".");
printf("%d",x);
}
puts("");
}
void toBinary(int x,int* v,int pos){
assert(inRange(x,0,225));
_for(i,0,w) v[pos+w-i-1]=x%2,x=x/2;
}
const int MAXN=1024;
int ips[MAXN][IPW+4];
int main(){
int m, ip[4], subNet[IPW];
while(scanf("%d",&m)==1){
memset(subNet,0,sizeof(subNet));
_for(i,0,m){
scanf("%d.%d.%d.%d",&ip[0],&ip[1],&ip[2],&ip[3]);
_for(j,0,4) toBinary(ip[j],ips[i],j*w);
}
int n;
for(n=0;n<IPW;n++){
bool same=true;
_for(j,1,m) if(ips[j][n]!=ips[j-1][n]){same=false; break;}
if(!same) break;
}
fill_n(subNet,n,1);
fill_n(ips[0]+n,IPW-n,0);
printIP(ips[0]);
printIP(subNet);
}
return 0;
}