传送门: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;
}