Uva 1590 IP Networks
这道题目是一道关于IP地址的题目,要深入理解这道题需要有一定的网络基础。
这道题目我第一次做的时候虽然也AC了,但代码写的比较复杂,不够精炼。近期刚刚参加了网络方面的培训,在有一定知识的基础上,又重写了这道题目。将很多步骤通过位运算(如移位,异或)进行了简化,在此贴一下前后两次的代码。
第二次代码:
#include <cstdio>
const int maxn = + ;
int IPs[maxn][];
int find_firstdiff(int m){
for(int i=;i<;i++)
for(int j=;j<m;j++)
if(IPs[j][i]!=IPs[][i])return i;
return ;
}
void printIP(int ser,int equ,int k){
int is_first=;
for(int i=;i<;i++){
if(is_first)printf(".");else is_first=;
if(i==k)printf("%d",equ);
else if (i<k) printf("%d",ser==-?IPs[][i]:ser);
else printf("");
}
printf("\n");
}
int main(){
int m;
while(scanf("%d",&m)!=EOF){
for(int i = ; i < m; i++)
scanf("%d.%d.%d.%d",&IPs[i][],&IPs[i][],&IPs[i][],&IPs[i][]);
int k =find_firstdiff(m);
int maxi=,mini=;
for(int i = ; i < m ; i++){
if(IPs[maxi][k] < IPs[i][k])maxi= i;
if(IPs[mini][k] > IPs[i][k])mini= i;
}
int c=,t=IPs[maxi][k];
if(maxi!=mini){
int d = IPs[maxi][k] ^ IPs[mini][k];
c=;
if(!d)c=;
else while(d){
d/=;
c++;
}
t= IPs[maxi][k] >>c <<c;
}
printIP(-,t,k);
printIP(,-(<<c),k);
}
return ;
}
第一次代码:
#include <cstdio>
#include <cstring>
#define maxn 1000+5
int s[maxn][];
void getBit(int *s,int num){
int n=;
while(num){
s[n--]=num%;
num/=;
} }
int main(){
int n;
while(scanf("%d",&n)==){
int netmask[]={};
int ip[]={};
int max,min;
for(int i=;i<n;i++){
scanf("%d.%d.%d.%d",&s[i][],&s[i][],&s[i][],&s[i][]);
}
int ok=,same=;
int k;
for(k=;k<;k++){
max=s[][k],min=s[][k];
for(int i=;i<n;i++){
if(i&&ok&&s[i][k]!=s[i-][k]){
ok=;same=k;
}
if(s[i][k]>max)max=s[i][k];
else if(s[i][k]<min)min=s[i][k];
}
if(!ok)break;
ip[k]=s[][k];
netmask[k]=;
}
int a[]={};
int c=max^min,sum1=,sum2=,sp=;
for(int i=;i<;i++){
if(c>=(<<i)&&c<(<<(i+))){
sp=i+;break;
}
}
getBit(a,min);
for(int i=;i<-sp;i++){
sum1=sum1+(a[i]*(<<(-i)));
sum2+=(*(<<(-i)));
}
ip[k]=sum1;
netmask[k]=sum2;
printf("%d.%d.%d.%d\n",ip[],ip[],ip[],ip[]);
printf("%d.%d.%d.%d\n",netmask[],netmask[],netmask[],netmask[]);
}
return ;
}
Uva 1590 IP Networks的更多相关文章
- uva 1590 - IP Networks(IP地址)
习题4-5 IP网络(IP Networks, ACM/ICPC NEERC 2005, UVa1590) 可以用一个网络地址和一个子网掩码描述一个子网(即连续的IP地址范围).其中子网 掩码包含32 ...
- UVA 1590 IP Networks JAVA
题意:输入m代表接下来的数据个数,计算接下来输入数据的网络掩码,和最小网络地址. 思路:①子网掩码:先将数据转为二进制,判断从哪一位开始有数据不一样,记下下标index,则子网掩码是index的前面是 ...
- UVa 1590 IP网络(简单位运算)
Description Alex is administrator of IP networks. His clients have a bunch of individual IP addres ...
- IP Networks UVA - 1590
Alex is administrator of IP networks. His clients have a bunch of individual IP addresses and he de ...
- 位运算基础(Uva 1590,Uva 509题解)
逻辑运算 规则 符号 与 只有1 and 1 = 1,其他均为0 & 或 只有0 or 0 = 0,其他均为1 | 非 也就是取反 ~ 异或 相异为1相同为0 ^ 同或 相同为1相异为0,c中 ...
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...
- Endless looping of packets in TCP/IP networks (Routing Loops)
How endless looping of packets in a TCP/IP network might occur? Router is a device used to interconn ...
- ease of rerouting traffic in IP networks without readdressing every host
https://en.wikipedia.org/wiki/Network_address_translation In the face of the foreseeable global IP a ...
- UVa 10253 - Series-Parallel Networks
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
随机推荐
- Python基础—03-运算符与分支结构
运算符与分支结构 运算符 赋值运算符 用'='表示,左边只能是变量 算术运算符 +.-.*:加.减.乘 /:除法运算,结果是浮点型 //:除法运算,结果是整型 %:求余 **:求幂 复合运算符 +=. ...
- 一次Redis 的性能测试和问题 [问题已经自己解决,见文章最后]
[我的问题]:请教个问题,我在本机搭建linux虚拟机+redis 3.2.6,然后在本机物理机上面测试虚拟机的redis性能,如下VM配置参数做测试,redis 的性能好像不算太好,问题待排查的两点 ...
- 在Python中使用正则表达式去掉字符串里的html标签
有时候会获得一些带html标签的字符串,需要把html标签去掉,获得干净的字符串,这时候可以使用正则表达式. 代码如下: import re htmeString = '''<ul id=&qu ...
- sencha inspector(调试工具)
Sencha Inspector 一:安装sencha inspector 使用Sencha Inspector下载Ext JS试用版(可在此处获得). 下载后,双击下载的文件以启动安装程序,然后按照 ...
- STM32CubeMx配置SPI注意的一个问题
这样配置SPI引脚 然后这样配置SPI参数 生成立这样的配置代码 /* SPI2 init function */static void MX_SPI2_Init(void){ /* SPI2 par ...
- 安装java 和 eclipse
昨天安装eclipse出现个问题, 安装完了创建第一个项目目录的时候弹窗报错an ......什么什么, 百度一堆没有用,后来发现是jdk12不支持,换了jdk8就可以了, 然后eclipse安装py ...
- Java学习笔记十二:Java中方法的重载
Java中方法的重载 什么是方法的重载呢? 如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了.如下所示 4 个方法名称都为 s ...
- 静态栈抽象数据类型stack实现
#include<stdio.h> #include<stdbool.h> #include<stdlib.h> #define MAX_STACK_SIZE 10 ...
- CPU计算密集型和IO密集型
CPU计算密集型和IO密集型 第一种任务的类型是计算密集型任务,其特点是要进行大量的计算,消耗CPU资源,比如计算圆周率.对视频进行高清解码等等,全靠CPU的运算能力.这种计算密集型任务虽然也可以用多 ...
- java容器操作一
List l = new ArrayList(); l.add(1); l.add("ne"); // 获取 System.out.println(l.get(0)); // 判断 ...