标签:
类型: 水题
题意: 给定一组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时,马上越界。
标签:
原文地址:http://www.cnblogs.com/elitegoblin/p/4560309.html