UVALive3520 UVa1590 POJ2799 IP Networks【进制+位运算】
来源:互联网 发布:mac翻墙代理软件 编辑:程序博客网 时间:2024/06/15 09:28
Regionals 2005 >> Europe - Northeastern
问题链接:UVALive3520 UVa1590 POJ2799 IP Networks。
问题简述:
一个网络地址ip和一个子网掩码可以描述一个子网。子网是一个数,它是包含4组8位二进制数,总共32位二进制数,前n个位为1,后32-n个位为0,如:255.255.255.48(11111111|11111111|11111111|11111000) 表示某个ip地址如果和A的前n位相等则说明其属于这个子网。
现给定m个网络地址组成一子网,求该子网的最小范围的首地址和子网掩码。
问题分析:
需要计算ip地址从哪一位开始不同,以此计算子网掩码。
再利用子网掩码计算最小ip。
程序说明:这里给出两个程序,后一种解法没有使用数组,自然要优于前一种解法。两个程序的计算方式不同,结果是一样的。
参考链接:(略)
题记:存储要能省则省。
AC的C++程序如下:
/* UVALive3520 UVa1590 POJ2799 IP Networks */#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MOD = (1 << 8);const int N = 1000;unsigned int ip[N];void output_result(unsigned int x){ int byte0, byte1, byte2, byte3; byte3 = x % MOD; x >>= 8; byte2 = x % MOD; x >>= 8; byte1 = x % MOD; x >>= 8; byte0 = x; printf("%d.%d.%d.%d\n", byte0, byte1, byte2, byte3);}int main(){ int m; unsigned byte0, byte1, byte2, byte3; while(cin >> m) { memset(ip, 0, sizeof(ip)); for(int i=0; i<m; i++) { scanf("%d.%d.%d.%d", &byte0, &byte1, &byte2, &byte3); ip[i] = (byte0 << 24) + (byte1 << 16) + (byte2 << 8) + byte3; } unsigned int mask = ~0; for(int i=1; i<m; i++) { unsigned int q = ip[i] ^ ip[0]; while(q) { mask &= ~(q | (q-1)); q = q & (q-1); } } output_result(ip[0] & mask); output_result(mask); } return 0;}
AC的C++程序如下:
/* UVALive3520 UVa1590 POJ2799 IP Networks */#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MOD = (1 << 8);const int N = 32;int visited[N];void output_result(unsigned int x){ int byte0, byte1, byte2, byte3; byte3 = x % MOD; x >>= 8; byte2 = x % MOD; x >>= 8; byte1 = x % MOD; x >>= 8; byte0 = x; printf("%d.%d.%d.%d\n", byte0, byte1, byte2, byte3);}int main(){ int m; unsigned int byte0, byte1, byte2, byte3, ip, mask, ip2; int bit; while(cin >> m) { memset(visited, -1, sizeof(visited)); while(m--) { scanf("%d.%d.%d.%d", &byte0, &byte1, &byte2, &byte3); ip = (byte0 << 24) + (byte1 << 16) + (byte2 << 8) + byte3; ip2 = ip; for(int i=0; i<N; i++) { bit = ip2 & 1LL; if(visited[i] == -1) visited[i] = bit; else if(visited[i] != bit) visited[i] = 2; ip2 >>= 1; } } int pos; for(pos=N-1; pos>=0; pos--) if(visited[pos] == 2) break; mask = 0; bit = 1; for(int j=0; j<N; j++) { if(j > pos) mask += bit; bit <<= 1; } output_result(ip & mask); output_result(mask); } return 0;}
阅读全文
0 0
- UVALive3520 UVa1590 POJ2799 IP Networks【进制+位运算】
- poj2799 IP Networks
- UVA1590-IP Networks
- Uva1590——IP networks
- 4-5 UVA1590 IP网络(IP Networks)
- UVA1590 IP网络(IP Networks)
- IP Networks (位运算)
- BFS:UVa1590-IP Networks (子网掩码相关知识)
- 算法竞赛入门经典(第2版)习题4-5 IP网络 IP Networks UVa1590
- 算法竞赛入门经典 第二版 习题4-5 IP网络 IP Networks uva1590
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
- uva1590
- uva1590
- UVa1590
- UVa1590
- UVA 1590 IP Networks 位操作解题
- 习题4-5 IP网络 UVa1590
- UVa1590 找最小子网掩码,和子网ip
- u-boot 2016.7之以太网驱动模型
- 代理模式
- Unreal Cook Book:神奇的Spline Mesh
- 系列18、组合模式-View及ViewGroup
- 解决用C#操作mysql数据库出错无法回滚的问题
- UVALive3520 UVa1590 POJ2799 IP Networks【进制+位运算】
- 什么是4:4:4、4:2:2、4:2:0?了解图像压缩取样的方式
- 两种创建线程的方式/线程的生命周期及各自使用同步锁时的区别
- 如何用Python写一个安卓APP
- Universal-Image-Loader源码收获
- Unsupported major.minor version 52.0异常
- .NET Reflector Visual Studio Extension
- hdu 3401 单调队列优化dp
- target-action