您的位置:首页 > 其它

Uva-1590 - IP Networks-AC

2015-02-04 23:59 351 查看
本题按照题意转换2进制容易一些,不要去找十进制的规律了,浪费了好长时间


思路:

将输入所有Ip转为二进制保存,检测所有IP二进制地址,看从哪位开始有不一样的,由此求出n。

最小IP地址为二进制前32-n位与其他IP一致,后n位全为0.

子网掩码是二进制前32-n位为1,后n位全为0.

AC代码:

#include <stdio.h>
#include <stdlib.h>

void DecToBin(int *p,int a)
{
int i=0,bin[8]={0};
while(a)
{
bin[i]=a%2;
a/=2; i++;
}
for (i=0;i<8;i++)
*(p+i)=bin[7-i];
}

void BinToDec(int bin[])
{
int i,j,n,m;
for (i=0;i<4;i++)
{
n=0; m=1;
for (j=i*8+7;j>=i*8;j--)
{
n+=bin[j]*m;
m*=2;
}
if (!i) printf("%d",n);
else printf(".%d",n);
}
putchar('\n');
}

int main()
{
int i,j,m,n,ipbin[1005][32];
int byte[4];
while(scanf("%d",&m)!=EOF)
{
for (i=0;i<m;i++)
for (j=0;j<4;j++)//此循环借助DecToBin函数将十进制IP转为二进制
{
scanf("%d",&byte[j]); getchar();
DecToBin(ipbin[i]+8*j,byte[j]);
}
/*for (i=0;i<32;i++)
printf("%d",ipbin[1][i]);*/
for (i=0;i<32;i++)
{
for (j=1;j<m;j++)
if (ipbin[j][i]!=ipbin[0][i])
break;
if (j!=m)  break;
}
n=32-i;
//printf("%d\n",n);
int minbin[32]={0},mask[32]={0};
for (i=0;i<32-n;i++)
{
minbin[i]=ipbin[0][i];
mask[i]=1;
}
/*for (i=0;i<32;i++)
printf("%d",minbin[i]);
printf("\n");
for (i=0;i<32;i++)
printf("%d",mask[i]);
printf("\n");*/
BinToDec(minbin);
BinToDec(mask);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: