Uva 1590 IP Networks

这道题目是一道关于IP地址的题目,要深入理解这道题需要有一定的网络基础。

这道题目我第一次做的时候虽然也AC了,但代码写的比较复杂,不够精炼。近期刚刚参加了网络方面的培训,在有一定知识的基础上,又重写了这道题目。将很多步骤通过位运算(如移位,异或)进行了简化,在此贴一下前后两次的代码。

第二次代码:

 1 #include <cstdio>
 2 const int maxn = 1000 + 10;
 3 int IPs[maxn][4];
 4 int find_firstdiff(int m){
 5     for(int i=0;i<4;i++)
 6         for(int j=0;j<m;j++)
 7             if(IPs[j][i]!=IPs[0][i])return i;
 8     return 3;
 9 }
10 void printIP(int ser,int equ,int k){
11     int is_first=0;
12     for(int i=0;i<4;i++){
13         if(is_first)printf(".");else is_first=1;
14         if(i==k)printf("%d",equ);
15         else if (i<k) printf("%d",ser==-1?IPs[0][i]:ser);
16         else printf("0");
17     }
18     printf("\n");
19 }
20 int main(){
21     int m;
22     while(scanf("%d",&m)!=EOF){
23         for(int i = 0 ; i < m; i++)
24             scanf("%d.%d.%d.%d",&IPs[i][0],&IPs[i][1],&IPs[i][2],&IPs[i][3]);
25         int k =find_firstdiff(m);
26         int maxi=0,mini=0;
27         for(int i = 0 ; i < m ; i++){
28             if(IPs[maxi][k] < IPs[i][k])maxi= i;
29             if(IPs[mini][k] > IPs[i][k])mini= i;
30         }
31         int c=0,t=IPs[maxi][k];
32         if(maxi!=mini){
33             int d = IPs[maxi][k] ^ IPs[mini][k];
34             c=0;
35             if(!d)c=1;
36             else while(d){
37                 d/=2;
38                 c++;
39             }
40             t= IPs[maxi][k] >>c <<c;
41         }
42         printIP(-1,t,k);
43         printIP(255,256-(1<<c),k);
44     }
45     return 0;
46 }

第一次代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #define maxn 1000+5
 4 int s[maxn][5];
 5 void getBit(int *s,int num){
 6     int n=7;
 7     while(num){
 8         s[n--]=num%2;
 9         num/=2;
10     }
11
12 }
13 int main(){
14     int n;
15     while(scanf("%d",&n)==1){
16         int netmask[5]={0};
17         int ip[5]={0};
18         int max,min;
19         for(int i=0;i<n;i++){
20             scanf("%d.%d.%d.%d",&s[i][0],&s[i][1],&s[i][2],&s[i][3]);
21         }
22         int ok=1,same=0;
23         int k;
24         for(k=0;k<4;k++){
25             max=s[0][k],min=s[0][k];
26             for(int i=0;i<n;i++){
27                 if(i&&ok&&s[i][k]!=s[i-1][k]){
28                     ok=0;same=k;
29                 }
30                 if(s[i][k]>max)max=s[i][k];
31                 else if(s[i][k]<min)min=s[i][k];
32             }
33             if(!ok)break;
34             ip[k]=s[0][k];
35             netmask[k]=255;
36         }
37         int a[10]={0};
38         int c=max^min,sum1=0,sum2=0,sp=0;
39         for(int i=0;i<8;i++){
40             if(c>=(1<<i)&&c<(1<<(i+1))){
41                 sp=i+1;break;
42             }
43         }
44         getBit(a,min);
45         for(int i=0;i<8-sp;i++){
46             sum1=sum1+(a[i]*(1<<(7-i)));
47             sum2+=(1*(1<<(7-i)));
48         }
49         ip[k]=sum1;
50         netmask[k]=sum2;
51         printf("%d.%d.%d.%d\n",ip[0],ip[1],ip[2],ip[3]);
52         printf("%d.%d.%d.%d\n",netmask[0],netmask[1],netmask[2],netmask[3]);
53     }
54     return 0;
55 }
时间: 2024-11-03 05:21:28

Uva 1590 IP Networks的相关文章

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.

UVA 1590 IP Networks JAVA

题意:输入m代表接下来的数据个数,计算接下来输入数据的网络掩码,和最小网络地址. 思路:①子网掩码:先将数据转为二进制,判断从哪一位开始有数据不一样,记下下标index,则子网掩码是index的前面是1,后面是0(2#),就是子网掩码,再转为10#输出: ②最小网络地址:用任意一个IP与子网掩码进行按位与运算得出最小IP,与运算的符号为&. 1 import java.util.Scanner; 2 3 public class UVA1590 { 4 5 public static void

1590 - IP Networks

巩固了下“局部变量传参给函数并要在函数中修改其值并返回调用处使用修改的值  需传指针” 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstdlib> 6 #include<cmath> 7 #include<cctype> 8 #include<vector> 9 #in

POJ 2799 IP Networks

IP Networks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2159   Accepted: 815 Description Alex is administrator of IP networks. His clients have a bunch of individual IP addresses and he decidedto group all those IP addresses into the

UVA 10253 - Series-Parallel Networks(数论+计数问题+递推)

题目链接:10253 - Series-Parallel Networks 白书的例题. 这题也是需要把问题进行转化,一个并联可以分为几个串联,然后串联可以分成边. 如此一来,最后叶子结点种数会是n,问题转化为去分配叶子结点,使得总和为n. 书上有两种方法,一种直接去递归,利用组合数学的方式去计算答案. 一种是推出递推式: 设dp[i][j]为一共j个叶子结点的树,子树的叶子最多的为i个的情况.然后对于一颗树,枚举恰好包含i个叶子的子树为p棵,那么相当于从f[i]颗树中选出p棵树的方案数,是可重

poj 2799 IP Networks 模拟

题意: 给一些ip,求包括他们的最小网络(网络号+子网掩码). 分析: 关键是找到从高位到低位从哪位开始不同. 代码: //poj 2799 //sep9 #include <iostream> using namespace std; typedef long long ll; ll vis[40]; void print(ll x) { ll a,b,c,d; d=x%(1<<8); x=x/(1<<8); c=x%(1<<8); x=x/(1<&

poj 2799 IP Networks (模拟/水题)

题目:给你一堆ip,求他们的最小网络地址和网络掩码 思路:找到最大的ip和最小的ip,把他们转化成二进制,从头到尾找二进制位相同的个数,最小网络地址把后面的不同的所有二进制变成0,网络掩码把前面的相同变成一 代码: #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; struct node { char k[35]

poj 2799 IP Networks 模拟 位运算

poj链接:http://poj.org/problem?id=2799 这题实在是非常的有趣... 写的时候也非常的开心... 然后就写跪了... 刚好讲了ip地址和子网掩码的只是 整个学期的通信导论我就只有这节课有事没去结果昨晚把这方面的只是补起来了有种功德圆满的感觉 network address是前(32-n)随意 后n位全零 network mask是前(32-n)全一 后n位全零 其次是练习了各种移位操作 我发现移位操作是个非常好用的东西 因为它自填充0 所以对一个二进制数往右移8位

UVa 10253 Series-Parallel Networks

<训练指南>中的第二种算法,其实本质上就是个背包.d[i][j]表示,在子树的节点数最大为i的情况下,j个节点的解.当之前的i-1,i-2,....0的结果都已知的时候,d[i][j]自然可根据下式求解: d[i][j]=sum{C(f(i)+p-1,p)*d[i-1][j-p*i] | p*i<=j} 其中f(i)表示恰好有i个节点的子树的数量.而C(f(i)+p-1,p)则表示有p棵i节点子树形成的组合数.然后运用乘法原理,剩余的节点数为j-p*i且包含的子树最多只有i-1个节点.继