这道题目是一道关于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 ;
}

最新文章

  1. 一步一步打造自己的Android图片浏览器(原创)
  2. android知识杂记(二)
  3. AudioCapabilities成员
  4. Java垃圾收集算法介绍
  5. ubuntu server下建立分区表/分区/格式化/自动挂载(转)
  6. 学Python后到底能干什么?
  7. vim global命令
  8. shell之函数
  9. 记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)
  10. 剑指Offer:面试题7——用两个栈实现队列(java实现)
  11. 输入一个正数 n,输出所有和为 n 连续正数序列。 java实现
  12. Java_HelloWorld
  13. UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
  14. vue 设计一个倒计时秒杀的组件
  15. django - 总结 - cnblog
  16. 初识C语言(一)
  17. Codeforces Round #436 B. Polycarp and Letters
  18. 902. Kth Smallest Element in a BST
  19. [转]application.properties详解 --springBoot配置文件
  20. vlookup+match高亮显示行

热门文章

  1. 转载:/etc/security/limits.conf 控制文件描述符,进程数,栈大小
  2. iframe中的页面在IE全屏模式下没有滚动条,正常模式有滚动条
  3. IDEA中解决Edit Configurations中没有tomcat Server选项的问题(附配置Tomcat)
  4. ASP.NET成员资格和角色管理
  5. 【cisco探索之路】
  6. Python学习:for 循环 与 range()函数
  7. Leecode刷题之旅-C语言/python-67二进制求和
  8. 嵌入式框架Zorb Framework搭建四:状态机的实现
  9. js数组长度
  10. wamp调用ICE中间件