uva 1590 - IP Networks(IP地址)

2024-02-28 21:58
文章标签 ip 地址 networks uva 1590

本文主要是介绍uva 1590 - IP Networks(IP地址),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

习题4-5 IP网络(IP Networks, ACM/ICPC NEERC 2005, UVa1590)
可以用一个网络地址和一个子网掩码描述一个子网(即连续的IP地址范围)。其中子网
掩码包含32个二进制位,前32-n位为1,后n位为0,网络地址的前32-n位任意,后n位为0。
所有前32-n位和网络地址相同的IP都属于此网络。
例如,网络地址为194.85.160.176(二进制为11000010|01010101|10100000|10110000),
子网掩码为255.255.255.248(二进制为11111111|11111111|11111111|11111000),则该子网
的IP地址范围是194.85.160.176~194.85.160.183。输入一些IP地址,求最小的网络(即包含IP
地址最少的网络),包含所有这些输入地址。
例如,若输入3个IP地址:194.85.160.177、194.85.160.183和194.85.160.178,包含上述3
个地址的最小网络的网络地址为194.85.160.176,子网掩码为255.255.255.248。
Sample Input
3
194.85.160.177
194.85.160.183
194.85.160.178
Sample Output
194.85.160.176
255.255.255.248
【注意:他可能有很多组输入,而每组输出之间没有空行】

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=833&problem=4465&mosmsg=Submission+received+with+ID+21184770

思路:
1、先将所有ip存起来,用数组或容器什么的。
2、转换二进制
3、从第一位开始,诸位比较所有的ip在这一位上的数字一样否
4、判断出最小网络位数,即掩码为1的位数。
5、转换十进制
(我用来存二进制的ip用的是string)
(用了下vector,当然也可以用数组存,一个32*1000的数组)


/*
110000100101010110100000_10110001
110000100101010110100000_10110111
110000100101010110100000_1011001011000010010101011010000010110000
11111111111111111111111111111000
*/
//特殊情况:只输入一个IP地址,这时掩码应该32位1
#include<iostream>
#include<stack>
#include<string>
#include<vector>
#include<cmath>
#include<cstdio>
using namespace std;
string binary(int dec)
{string str="00000000";stack<int> s;int bin=0;for(int i=7;i>=0;i--){//s.push(dec%2);str[i]=dec%2+'0';dec /= 2;}
//    while(!s.empty())
//    {
//        bin = bin*10 + s.top();
//        s.pop();
//    }
//    return bin;return str;
}
int decimal(string bin)
{int dec =0;for(int i=0;i<8;i++) //从高位开始{dec += (int)pow(2,8-i-1)* (bin[i]-'0');}return dec;
}
int main()
{int T;while(cin>>T){vector<string>ip; //  存储输入的所有ipint num=0;if(T==1)  //防止只输入一个地址的特殊情况num=32;while(T--)    //输入{int a[4];string str;scanf("%d.%d.%d.%d",&a[0],&a[1],&a[2],&a[3]);for(int i=0;i<4;i++){str += binary(a[i]);}ip.push_back(str);}for(int j=0;j<32;j++)    //判断相等的位数{int iff=0;for(int i=1;i<ip.size();i++){//cout<<ip.at(i)<<endl;if(ip.at(0)[j] == ip.at(i)[j])  //这一位相等{iff=1;}else{iff=0;break;}}if(iff)         //这一位相等,掩码位数加一num++;elsebreak;}string zero="00000000"; //备用0string mask,minip;int score[4];//存储最小网络的四个十进制ip地址段int score2[4];//存储mask的四个十进制的ip地址段for(int i=1;i<=32-num;i++)  //先从最后开始补0{minip='0'+minip;mask='0'+mask;}for(int i=num-1;i>=0;i--)   //倒的补{minip=ip[0].at(i)+minip;mask='1'+mask;}//        cout<<num<<endl;
//        for(int i=0;i<ip.size();i++)
//            cout<<ip[i]<<endl;
//        cout<<endl;
//        cout<<mask<<endl;for(int i=0;i<4;i++)  //运算最小网络{score[i] =decimal(minip.substr(i*8,8));score2[i] =decimal(mask.substr(i*8,8));//以下淘汰的方法是:边变换,边比对是否位数到了最小网络位。//比较上面的先做好一个最小网络的二进制地址,然后在直接变换。要更复杂
//            if(i*8+8>num)
//            {
//                //cout<<i*8<<" "<<num<<endl;
//                //cout<<ip[0].substr(i*8,num-i*8)<<"|"<<zero.substr(0,32-num)<<endl;
//                score[i]=decimal(ip[0].substr(i*8,num-i*8)+zero.substr(0,32-num));
//            }
//            else
//            {
//                //cout<<ip[0].substr(i*8,8)<<endl;
//                score[i]=decimal(ip[0].substr(i*8,8));
//            }}printf("%d.%d.%d.%d\n",score[0],score[1],score[2],score[3]);printf("%d.%d.%d.%d\n",score2[0],score2[1],score2[2],score2[3]);}return 0;
}
//AC at 2018/4/22

(题外话:好在上学期的网络课设就是算ip地址,所以这道题我才想了半个多小时就有思路了(哭))

这篇关于uva 1590 - IP Networks(IP地址)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/756738

相关文章

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取