当前位置: 首页 > news >正文

题解:UVA1590 IP网络 IP Networks

解决思路

1. 读取和转换数据

输入数据
通常,输入数据是若干个 IP 地址,每个 IP 地址由 4 4 4 个字节(即 32 32 32 位)组成。

转换为二进制表示
为了处理这些 IP 地址,我们需要将每个 IP 地址从点分十进制格式(如192.168.1.1)转换为 32 32 32 位的二进制字符串。转换步骤如下:

  1. 将每个 IP 地址的每个十进制段(如192)转换为 8 8 8 位的二进制数(如11000000)。
  2. 将四个 8 8 8 位的二进制数连接成一个 32 32 32 位的二进制字符串(如11000000101010000000000100000001)。

2. 找到公共前缀

公共前缀的概念
公共前缀是所有 IP 地址的二进制表示中,从左开始连续相同的位数。这一部分表示了这些 IP 地址的共同网络部分。

找到公共前缀的步骤

  1. 将所有 IP 地址的 32 32 32 位二进制字符串对齐。
  2. 从最左边开始逐位比较,直到遇到第一个不同的位为止。
  3. 记录相同的位数,这就是公共前缀的长度。

3. 确定网络掩码

计算网络掩码
网络掩码是用来区分IP地址的网络部分和主机部分的。掩码的长度等于公共前缀的长度。网络掩码可以用 32 32 32 位的二进制数表示,其中前面是 1 1 1 ,后面是 0 0 0 。例如,如果公共前缀是 24 24 24 位,则网络掩码是11111111.11111111.11111111.00000000,即255.255.255.0

构造网络掩码

  1. 将公共前缀的长度转换为掩码。例如,公共前缀长度是 24 24 24 位,则掩码是255.255.255.0
  2. 转换为点分十进制格式。

4. 构造最终输出

网络地址的计算
网络地址是用公共前缀填充剩余的位数(即主机位)为 0 0 0 。例如,如果公共前缀是110000001010100000000001(前 24 24 24 位),剩下的 8 8 8 位为 0 0 0 ,则网络地址的二进制表示是11000000101010000000000100000000。将其转换为点分十进制格式,即得到网络地址(如192.168.1.0)。

输出结果

  1. 输出网络地址。
  2. 输出网络掩码。

示例

假设有三个 IP 地址:192.168.1.1, 192.168.1.2, 和192.168.1.100

转换为二进制

  • 192.168.1.111000000.10101000.00000001.00000001
  • 192.168.1.211000000.10101000.00000001.00000010
  • 192.168.1.10011000000.10101000.00000001.01100100

公共前缀
比较这三个二进制字符串,发现前 24 24 24 位是相同的。因此,公共前缀长度是 24 24 24 位。

网络掩码
掩码是255.255.255.0

网络地址
将前 24 24 24 位作为网络地址,其余位填充 0 0 0 ,即192.168.1.0

最终输出

  • 网络地址: 192.168.1.0
  • 网络掩码: 255.255.255.0

就这样,即可解决这一问题了。

代码

//拒绝使用万能头!!!(doge)
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>  
using namespace std;
// 定义一个32位无符号整型
typedef unsigned int uint32_t;
// 将IP地址由字符串转为32位二进制
uint32_t ipToBinary(const string &ip) {int a, b, c, d;uint32_t binaryIp;// 使用sscanf解析出IP的4个部分哦sscanf(ip.c_str(), "%d.%d.%d.%d", &a, &b, &c, &d);// 将4个部分组合成32位整型binaryIp = (a << 24) | (b << 16) | (c << 8) | d;return binaryIp;
}
// 将32位表示的IP转位字符串
string binaryToIp(uint32_t binaryIp) {char ip[16];  //IPv4最多15个字符(xxx.xxx.xxx.xxx)+null终止符sprintf(ip, "%u.%u.%u.%u", (binaryIp >> 24) & 0xFF, //F可以不大写(binaryIp >> 16) & 0xFF, (binaryIp >> 8) & 0xFF, binaryIp & 0xFF);return string(ip);
}
int main() {int m;cin >> m;vector<uint32_t> ips(m);// 读取所有IP并转为二进制for (int i = 0; i < m; ++i) {string ip;cin >> ip;ips[i] = ipToBinary(ip);}// 找到IP的公共前缀uint32_t mask = 0xFFFFFFFF;for (int i = 1; i < m; ++i) {mask &= ~(ips[0] ^ ips[i]);}// 计算掩码长度int n = 32;while (n > 0 && (mask & 0x80000000) == 0) {mask <<= 1;--n;}// 计算网络地址uint32_t networkAddress = ips[0] & mask;cout << binaryToIp(networkAddress) << "\n";习惯性"\n"cout << binaryToIp(mask) << "\n";return 0;
}
//完结撒花!!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • iframe中postmessage重复返回多次相同信息
  • STM32G474的HAL_ADC_Start_DMA()传递指针问题
  • JS中this的指向问题、JS的执行机制、offset、client、scroll
  • 面试题:遍历三颗相连的满二叉树
  • OpenCV(第二关--读取图片和摄像头)实例+代码
  • 探索贪心算法:解决优化问题的高效策略
  • selenium(二)基于java、元素操控、Frame切换、元素等待
  • 【Go语言基础】调度器模型GPM与垃圾回收器GC
  • GNU/Linux - RSYSLOG
  • 基于大数据分析景区消费行为影响因素研究【消费等级预测、携程,去哪网数据抓取】
  • 去雾去雨算法
  • 力扣top300:1.两数之和
  • 37-RPC HTTP区别是什么
  • 用于目标说话人提取的统一视听线索
  • CSS3 3D 转换
  • ➹使用webpack配置多页面应用(MPA)
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • ES6之路之模块详解
  • JS+CSS实现数字滚动
  • leetcode386. Lexicographical Numbers
  • opencv python Meanshift 和 Camshift
  • PaddlePaddle-GitHub的正确打开姿势
  • SQLServer之索引简介
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • windows下如何用phpstorm同步测试服务器
  • 第十八天-企业应用架构模式-基本模式
  • 给github项目添加CI badge
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 那些被忽略的 JavaScript 数组方法细节
  • 微信小程序设置上一页数据
  • nb
  • puppet连载22:define用法
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ‌JavaScript 数据类型转换
  • # Redis 入门到精通(一)数据类型(4)
  • #{}和${}的区别?
  • $.ajax()方法详解
  • (1)STL算法之遍历容器
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (2020)Java后端开发----(面试题和笔试题)
  • (4) PIVOT 和 UPIVOT 的使用
  • (Charles)如何抓取手机http的报文
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (js)循环条件满足时终止循环
  • (LeetCode) T14. Longest Common Prefix
  • (Oracle)SQL优化技巧(一):分页查询
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (转)大型网站架构演变和知识体系
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ***利用Ms05002溢出找“肉鸡
  • .env.development、.env.production、.env.staging
  • .Net Core 中间件验签