1590:IP Networks

IP Networks


注意单个IP地址及网络地址后面加 .0 的情况(cnt < 3)。

version1:

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000 + 5;
int n,num[maxn][4];
int main(){
    while(scanf("%d",&n) != EOF){
        for(int i = 0;i < n;i++){
            scanf("%d.%d.%d.%d",&num[i][0],&num[i][1],&num[i][2],&num[i][3]);
        }
        int cnt = 0,cnt2 = 0;
        for(int i = 0,j;i < 4;i++){
            int sta = num[0][i];
            for(j = 1;j < n;j++){
                if(num[j][i] != sta) break;
            }
            if(j == n) cnt++;
            else break;
        }
        for(int i = 7,j;i >= 0;i--){
            int sta = (num[0][cnt]>>i) & 1;
            for(j = 1;j < n;j++){
                if(((num[j][cnt]>>i) & 1) != sta) break;
            }
            if(j == n) cnt2++;
            else break;
        }
        for(int i = 0;i < cnt;i++){
            printf("%d",num[0][i]);
            if(i < 3) putchar('.');
        }
        if(cnt < 4){
            int net = 0,e = 7;
            for(int i = 0;i < cnt2;i++){
                net += (1<<e)*((num[0][cnt]>>e) & 1);
                e--;
            }
            printf("%d",net);
        }
        int left = 4 - (cnt + 1);
        while((left--) > 0){
            printf(".0");
        }
        putchar('\n');
        for(int i = 0;i < cnt;i++){
            printf("255");
            if(i < 3) putchar('.');
        }
        if(cnt < 4){
            int sub = 0,e = 7;
            for(int i = 0;i < cnt2;i++){
                sub += 1<<(e--);
            }
            printf("%d",sub);
        }
        left = 4 - (cnt + 1);
        while((left--) > 0){
            printf(".0");
        }
        putchar('\n');
    }
    return 0;
}

version 2:

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000 + 5;
int n,num[maxn][4],res[2][4];
int main(){
    while(scanf("%d",&n) != EOF){
        for(int i = 0;i < n;i++)
            scanf("%d.%d.%d.%d",&num[i][0],&num[i][1],&num[i][2],&num[i][3]);
        //cnt 是8位相同,cnt2 是1位
        int cnt = 0,cnt2 = 0;
        for(int i = 0,j;i < 4;i++){
            int sta = num[0][i];
            for(j = 1;j < n;j++){
                if(num[j][i] != sta) break;
            }
            if(j == n) cnt++;
            else break;
        }
        for(int i = 7,j;i >= 0;i--){
            int sta = (num[0][cnt]>>i) & 1;
            for(j = 1;j < n;j++){
                if(((num[j][cnt]>>i) & 1) != sta) break;
            }
            if(j == n) cnt2++;
            else break;
        }
        memset(res,0,sizeof(res));
        int i,e = 7,net = 0,sub = 0;
        for(int i = 0;i < cnt2;i++){
            net += (1<<e)*((num[0][cnt]>>e) & 1);
            sub += 1<<(e--);
        }
        for(i = 0;i < cnt;i++){
            res[0][i] = num[0][i];
            res[1][i] = 255;
        }
        if(i < 4){
            res[0][i] = net;
            res[1][i] = sub;
        }
        printf("%d.%d.%d.%d\n",res[0][0],res[0][1],res[0][2],res[0][3]);
        printf("%d.%d.%d.%d\n",res[1][0],res[1][1],res[1][2],res[1][3]);
    }
    return 0;
}

posted @ 2018-04-12 21:56  ACLJW  阅读(150)  评论(0编辑  收藏  举报