Uva 1590 IP Networks
2024-10-21 19:48:26
这道题目是一道关于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 ;
}
最新文章
- 一步一步打造自己的Android图片浏览器(原创)
- android知识杂记(二)
- AudioCapabilities成员
- Java垃圾收集算法介绍
- ubuntu server下建立分区表/分区/格式化/自动挂载(转)
- 学Python后到底能干什么?
- vim global命令
- shell之函数
- 记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)
- 剑指Offer:面试题7——用两个栈实现队列(java实现)
- 输入一个正数 n,输出所有和为 n 连续正数序列。 java实现
- Java_HelloWorld
- UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
- vue 设计一个倒计时秒杀的组件
- django - 总结 - cnblog
- 初识C语言(一)
- Codeforces Round #436 B. Polycarp and Letters
- 902. Kth Smallest Element in a BST
- [转]application.properties详解 --springBoot配置文件
- vlookup+match高亮显示行
热门文章
- 转载:/etc/security/limits.conf 控制文件描述符,进程数,栈大小
- iframe中的页面在IE全屏模式下没有滚动条,正常模式有滚动条
- IDEA中解决Edit Configurations中没有tomcat Server选项的问题(附配置Tomcat)
- ASP.NET成员资格和角色管理
- 【cisco探索之路】
- Python学习:for 循环 与 range()函数
- Leecode刷题之旅-C语言/python-67二进制求和
- 嵌入式框架Zorb Framework搭建四:状态机的实现
- js数组长度
- wamp调用ICE中间件