码迷,mamicode.com
首页 > Web开发 > 详细

UVA 1590 IP Networks

时间:2015-06-08 16:59:44      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

类型: 水题 

题意: 给定一组ip地址,在一个子网中,  求其子网号 及 net mask .

题分析: 每个字节判断; 多个IP的同一序号的字节存入 vector, 排序, 判断第一个和最后一个相同来判断是否一致, 这两个的掩码就是此字节的掩码。

代码: 

 1 int get_mask(int fst, int last, int &ip)
 2 {
 3     int mask = 0xff;
 4     for(int ct = 8; ct > 0; ct --)
 5     {
 6         if((fst & mask) == (last & mask) )
 7             break;
 8         mask <<= 1;
 9     }
10     ip = fst & mask;
11     return (mask & 0xff);
12 }
13 
14 int main() {
15 
16     int T;
17     vector<int> ar_vec[4];
18     for(;scanf("%d", &T) != EOF;)
19     {
20         getchar();
21         for(int i = 0; i < 4; i++)
22             ar_vec[i].clear();
23         for(int i = 0; i < T; i ++)
24         {
25             int n1, n2, n3, n4;
26             scanf("%d.%d.%d.%d", &n1, &n2, &n3, &n4);
27             getchar();
28             ar_vec[0].push_back(n1);
29             ar_vec[1].push_back(n2);
30             ar_vec[2].push_back(n3);
31             ar_vec[3].push_back(n4);
32         }
33         int mask, ip;
34         int pos;
35         for(pos = 0; pos < 4; pos ++)
36         {
37             sort(ar_vec[pos].begin(), ar_vec[pos].end() );
38             int size = ar_vec[pos].size();
39             int fst = ar_vec[pos][0];
40             int last = ar_vec[pos][size - 1];
41             if(fst != last)
42             {
43                 mask = get_mask(fst, last, ip);
44                 break;
45             }
46         }
47         int ar_ip[4];
48         int ar_mask[4];
49         for(int k = 0; k < pos; k ++)
50             ar_ip[k] = ar_vec[k][0];
51         if(pos < 4)
52             ar_ip[pos] = ip;
53         for(int k = pos + 1; k < 4; k ++)
54             ar_ip[k] = 0;
55         //mask
56         for(int k = 0; k < pos; k ++)
57             ar_mask[k] = 255;
58         if(pos < 4)
59             ar_mask[pos] = mask;
60         for(int k = pos + 1; k < 4; k ++)
61             ar_mask[k] = 0;
62         printf("%d.%d.%d.%d\n", ar_ip[0], ar_ip[1], ar_ip[2], ar_ip[3]);
63         printf("%d.%d.%d.%d\n", ar_mask[0], ar_mask[1], ar_mask[2], ar_mask[3]);
64     }
65     return 0;
66 }

 

编码错误及WA:

1. 技术分享 获取到符合条件的位置应立刻 break, 否则还会 ++。

2. 想着等会记着XXX,一定会忘!!!: 对字节做mask,  0xff, 左移应为 0xfe, 赋给 int, 左移变为 0x1fe, 用来 mask char 也没错, 但返回时忘记 & 0xff, 没有去掉高位的 0x1。

   教训:  非等价变化很容易出错,尽量避免。

3. 数组赋值时考虑下标是否越界:技术分享 , 当 pos == 4时,马上越界。

 

UVA 1590 IP Networks

标签:

原文地址:http://www.cnblogs.com/elitegoblin/p/4560309.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!