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