UVA1590 IP网络(IP Networks)

第一次写的时候,把输入当成字符串处理,然后又转换成整数。看了别人的解答后,才知道可以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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值