Uva1590

Posted Western_Trail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva1590相关的知识,希望对你有一定的参考价值。

/*
对输入的ip分成四部分存储,然后将每部分的值进行排序,判断每部分最小值和最大值是否相同,
如果不同则找出每部分8位二进制最后几位开始不同的个数,然后用不同的个数查表可得该部分的
掩码值。再用一个循环,遍历掩码数组,数组第一次不为255时,则将后续的掩码部分全为设置为0,
这样就求出了掩码的值。

最后用输入的任意一条IP地址与求出的掩码进行按位与运算,则可得子网的网络地址。 
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
 
int mask_table[] = {255, 254, 252, 248, 240, 224, 192, 128, 0};
int ip[4][1024];

int main()
{
    int m;
    while(scanf("%d",&m)!=EOF){
        memset(ip,0,sizeof(ip));
        //输入ip地址 
        for(int i = 0;i < m;i++){
            scanf("%d.%d.%d.%d",&ip[0][i],&ip[1][i],&ip[2][i],&ip[3][i]);
        }
        
        int mask[4];        //用来存储掩码 
        int minip[4];
        //排序每部分的ip地址
        for(int i = 0;i < 4;i++){
            sort(ip[i],ip[i]+m);
            int max = ip[i][m-1];
            int min = ip[i][0];
            int dif = 0;    //存储最后几位不同 
            for(int j = 1;j <= 8;j++){
                if(min%2 != max%2){
                    dif = j;
                }
                min /= 2;
                max /= 2;
            }
            mask[i] = mask_table[dif];  
        }
        
        for(int i = 0;i < 4;i++){
            if(mask[i] != 255){
                for(int j = i+1;j < 4;j++){
                    mask[j] = 0;
                }
                break;
            }
        }
        
        for(int i = 0;i < 4;i++){
            minip[i] = ip[i][0] & mask[i];
        }
        
        printf("%d.%d.%d.%d\n",minip[0],minip[1],minip[2],minip[3]);
        printf("%d.%d.%d.%d\n",mask[0],mask[1],mask[2],mask[3]);
    }       
    return 0;
}

以上是关于Uva1590的主要内容,如果未能解决你的问题,请参考以下文章

算法习题---4-5IP网络(Uva1590)

uva1590

位运算基础(Uva 1590,Uva 509题解)

Uva1590

故障分析基于matlab ICA故障监测含Matlab源码 1590期

UVa 1442 - Cave