UVA - 1590 IP Networks

传送门:UVA-1590

这题就是个基本的位运算,我却调了好久。。。对所有网址从左往右,按位从高往低找到第一个不同的二进制位

AC代码:
 

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=1000+9;
int pq[maxn][4],m;//pq存储网址的十进制数字 
int main()
{
	while(cin>>m){
		for(int i=0;i<m;++i) scanf("%d.%d.%d.%d",&pq[i][0],&pq[i][1],&pq[i][2],&pq[i][3]); 
		int num,pos=-1;//num是有不同的数字,pos是第几位 
		for(int i=0;i<4;++i){
			int flag=1;
			num=i;
			for(int j=7;j>=0;--j){
				int tmp=(1<<j)&pq[0][i];
				for(int k=1;k<m;++k)
					if(((1<<j)&pq[k][i])!=tmp){flag=0;pos=j;break;}
				if(!flag) break;
			}
			if(!flag) break;
		}
		int cnt1=0,cnt2=0;//cnt1表示网络的第num个数,cnt2表示子网掩码的第num个数 
		for(int i=7;i>pos;--i) cnt1+=(pq[0][num]&(1<<i)),cnt2+=(1<<i);
		if(num==3) printf("%d.%d.%d.%d\n255.255.255.%d\n",pq[0][0],pq[0][1],pq[0][2],cnt1,cnt2);
		else if(num==2) printf("%d.%d.%d.0\n255.255.%d.0\n",pq[0][0],pq[0][1],cnt1,cnt2);
		else if(num==1) printf("%d.%d.0.0\n255.%d.0.0\n",pq[0][0],cnt1,cnt2);
		else printf("%d.0.0.0\n%d.0.0.0\n",cnt1,cnt2);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值