IP网络(IP Networks,UVa1590)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值