POJ 2799

题意:给出n个同属一个网络的IP地址,求其子网掩码以及网络地址。

题解:只需知道子网掩码与ip地址按位与后等于同一个值,且子网掩码前面全是1,后面全是0即可。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 struct IP

 6 {

 7     int b[4];

 8 }po[1005];

 9 int lowbit(int x)

10 {

11     return x&(-x);

12 }

13 int lg(int x)

14 {

15     int pos=0;

16     while(x)

17     {

18         x>>=1;

19         pos++;

20     }

21     return pos;

22 }

23 int main()

24 {

25     int n;

26     while(scanf("%d",&n)!=EOF)

27     {

28         for(int i=0;i<n;i++)

29             scanf("%d.%d.%d.%d",&po[i].b[0],&po[i].b[1],&po[i].b[2],&po[i].b[3]);

30         IP masks,network;

31         int tp[4];

32         for(int i=0;i<4;i++)

33             tp[i]=po[0].b[i],masks.b[i]=255;

34         for(int i=1;i<n;i++)

35             for(int j=0;j<4;j++)

36                 tp[j]&=po[i].b[j];

37         for(int i=0;i<4;i++)

38             network.b[i]=tp[i];

39         int last=0;

40         for(int i=0;i<n;i++)

41         {

42             for(int j=0;j<4;j++)

43             {

44                 int k,pos=0;

45                 if(k=(tp[j]^po[i].b[j]))

46                 {

47                     while(k)

48                     {

49                         pos=lowbit(k);

50                         k-=pos;

51                     }

52                     last=max(last,lg(pos)+(3-j)*8);

53                 }

54             }

55         }

56         if(last>24)

57         {

58             masks.b[0]&=~((1<<(last-24))-1);

59             masks.b[1]=masks.b[2]=masks.b[3]=0;

60         }

61         else if(last>16)

62         {

63             masks.b[1]&=~((1<<(last-16))-1);

64             masks.b[2]=masks.b[3]=0;

65         }

66         else if(last>8)

67         {

68             masks.b[2]&=~((1<<(last-8))-1);

69             masks.b[3]=0;

70         }

71         else if(last>0)

72         {

73             masks.b[3]&=~((1<<last)-1);

74         }

75         for(int i=0;i<4;i++)

76             network.b[i]&=masks.b[i];

77         printf("%d.%d.%d.%d\n",network.b[0],network.b[1],network.b[2],network.b[3]);

78         printf("%d.%d.%d.%d\n",masks.b[0],masks.b[1],masks.b[2],masks.b[3]);

79     }

80     return 0;

81 }

你可能感兴趣的:(poj)