优雅竞赛之 UVa 1590 IP Networks
来源:互联网 发布:今十数据 编辑:程序博客网 时间:2024/06/01 20:45
IP网络 UVa 1590
来自 算法入门 竞赛经典 第二版 第四章
习题4-5
UVa原题链接
最初以为该题比较简单,真正开始写才遇到许多问题。
问题:
- 位操作不直观,思考了一会
- 右移32位与没有位移相同
优雅之处:
- 简单易懂的位操作
- 简单化的解题方法
- 没有使用数组
- 代码逻辑清晰
关键之处:
将ip地址转成整数,即可方便直接位操作运算,而不用使用大量数组同时跨数组计算,使代码臃肿,可读性低。
具体实现代码如下
#include <iostream>#include <cstring>#include <string>#include <sstream>using namespace std;string int_to_ip(int i) { stringstream ss; string ip; int i1 = (i >> 24) & 0xff; int i2 = (i >> 16) & 0xff; int i3 = (i >> 8) & 0xff; int i4 = (i >> 0) & 0xff; ss << i1 << '.' << i2 << '.' << i3 << '.' << i4; ss >> ip; return ip;}int ip_to_int(string ip) { stringstream in(ip); int r = 0; for (int i = 0; i < 4; i++) { string part; getline(in, part, '.'); int v = atoi(part.c_str()) & 0xff; r |= v << (3 - i) * 8; } return r;}int main() { int n; while (cin >> n) { unsigned int ip_min = 0xffffffff; unsigned int ip_max = 0x00000000; for (int i = 0; i < n; i++) { string str; cin >> str; unsigned int ip = ip_to_int(str) & 0xffffffff; if (ip > ip_max) { ip_max = ip; } if (ip < ip_min) { ip_min = ip; } } int bits = 32; for (; bits > 0; bits--) { if (ip_min >> (bits - 1) != ip_max >> (bits - 1)) { //找到最高不同位,从此为开始将掩码和最小ip往后全置0即可 break; } } unsigned int mask = 0b11111111111111111111111111111111; for (int i = 0; i < bits; i++) { //将末尾位全部置0 mask &= ~(1 << i); ip_min &= ~(1 << i); } cout << int_to_ip(ip_min) << endl; cout << int_to_ip(mask) << endl; } return 0;}
最后附上一段网上的实现
[刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
#include<iostream>unsigned i, m, num, ip[4], ipmax[4], ipmin[4], mask[4];int cmp(unsigned *a, unsigned *b) {//compare for (int i = 0;i < 4;++i) { if (a[i] < b[i]) return -1; if (a[i] > b[i]) return 1; } return 0;}int main(){ //freopen("in.txt", "r", stdin); while (scanf("%d", &m) != -1) { scanf("%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]); for (i = 0;i < 4;++i) ipmax[i] = ipmin[i] = ip[i]; while (--m) { scanf("%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]); if (cmp(ip, ipmax) == 1) for (i = 0;i < 4;++i) ipmax[i] = ip[i]; else if (cmp(ip, ipmin) == -1) for (i = 0;i < 4;++i) ipmin[i] = ip[i]; } for (i = 0;i < 4;++i) { if (i == 0 || mask[i - 1] == 255) { mask[i] = 255 ^ (ipmax[i] ^ ipmin[i]); for (int j = 0;j <= 8;++j) if ((mask[i] >> j) == (255 >> j)) { mask[i] = ((mask[i] >> j) << j); break; } } else mask[i] = 0; } printf("%u.%u.%u.%u\n", mask[0] & ipmax[0], mask[1] & ipmax[1], mask[2] & ipmax[2], mask[3] & ipmax[3]); printf("%u.%u.%u.%u\n", mask[0], mask[1], mask[2], mask[3]); } return 0;}
评价:使用了大量数组操作,虽然使用位操作,但没有掌握其核心。可读性极差,逻辑不清晰,过程复杂。使用合理位操作可以大量简化代码。
阅读全文
0 0
- 优雅竞赛之 UVa 1590 IP Networks
- UVA 1590 - IP Networks
- UVA 1590 IP Networks
- UVa 1590 - IP Networks
- UVA - 1590 IP Networks
- UVA 1590 - IP Networks
- UVa 1590 IP Networks
- Uva 1590 IP Networks
- UVA 1590 IP Networks
- Uva 1590 IP Networks
- UVa 1590 IP Networks
- Uva-1590 - IP Networks-AC
- UVa 1590 IP Networks(IP 网络)
- UVA 1590 IP Networks(IP 网络)
- UVa 1590 IP Networks (IP网络)
- 小紫书 4-5 UVA 1590 IP Networks
- UVA 1590 IP Networks 简单模拟
- UVA 1590 IP Networks 位操作解题
- 使用Servlet在提交过程中的注意事项
- WPF样式(Style)入门
- DUT数模组 第一周周报
- JSON的使用方法
- ASC 16
- 优雅竞赛之 UVa 1590 IP Networks
- Filter(过滤器)常见应用(三)——权限管理系统(一)
- lua使用table.concat连接大量字符串
- 测试工具
- JQuery对象可以理解为有多个Js对象组成的数组
- 谈谈8年C++面向对象设计的经验体会
- Filter(过滤器)常见应用(三)——权限管理系统(二)
- Markdown文件简易指南
- 你对webpack的看法