您的位置:首页 > 理论基础 > 计算机网络

UVA1590 IP网络(IP Networks)

2016-06-05 22:45 471 查看
第一次写的时候,把输入当成字符串处理,然后又转换成整数。看了别人的解答后,才知道可以scanf("%d.%d.%d.%d");

另外将整数转化成二进制,我用的是辗转相除法。最后得到的是正确结果。可是超时了。

换成位运算后快多了。

#include<stdio.h>
#include<string.h>

char s[1050][40];
int num[1050][5];
int sbin[1050][35];
int mask[35];

int main(){
//freopen("input.txt","r",stdin);
int a;
while(scanf("%d",&a)==1){

memset(s,0,sizeof(s));
memset(num,0,sizeof(num));
memset(sbin,0,sizeof(sbin));
for(int i=0;i<35;i++){mask[i]=1;}
for(int i=0;i<a;i++){
scanf("%d.%d.%d.%d",&num[i][0],&num[i][1],&num[i][2],&num[i][3]);//直接将整数提取出来!
for(int j=0;j<4;j++){
for(int t=7,k=0;k<8;k++,t--){
sbin[i][j*8+k]=(num[i][j]>>t)%2;//位运算大大地减小了时间!!!
}
}

}

int b=0,flag=1;
while(b<32){
for(int i=0;i<a;i++){
if(sbin[i][b]!=sbin[0][b]){
flag=0;break;
}
}
if(!flag) break;
b++;
}

for(int j=b;j<=31;j++){
sbin[0][j]=0;
mask[j]=0;
}
int t1=0,t2=0,t3=0,t4=0;//转换为十进制
int m1=0,m2=0,m3=0,m4=0;
for(int i=0;i<8;i++){
t1=t1*2+sbin[0][i];
t2=t2*2+sbin[0][i+8];
t3=t3*2+sbin[0][i+16];
t4=t4*2+sbin[0][i+24];
m1=m1*2+mask[i];
m2=m2*2+mask[i+8];
m3=m3*2+mask[i+16];
m4=m4*2+mask[i+24];
}

printf("%d.%d.%d.%d\n",t1,t2,t3,t4);
printf("%d.%d.%d.%d\n",m1,m2,m3,m4);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: