Uva 1590 IP Networks的一个问题

发布于 2022-09-11 17:34:33 字数 3165 浏览 19 评论 0

题目:https://vjudge.net/problem/UV...
uDebug:https://www.udebug.com/UVa/1590

uDebug测试样例都过了,可是提交还是WA,不知道问题出在哪里了,不知道是否有大神能帮忙看看。

思路

  1. 将IP地址(二维数组)全转换为二进制表示,然后全部相加成一个一维数组,然后遍历一维数组,如果遇到不是0或者不是总IP地址数,说明从这位开始便不同,记录位置
  2. 然后遍历到这位之前的ip不变,后面补零便为最小IP
  3. 遍历到这位之前的ip全为1,后面补零便为子网掩码
  4. 转换成十进制输出即可
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 1000



int code[1001][32];

FILE *fin, *fout;
int DEBUG = 0;

void dec_to_bin(int num, int n, int idx){ // 十进制转二进制
    int c = 7+idx;
    while(num != 0){
        code[n][c] = num % 2;
        c--;
        num /= 2;
    }
}

void encode(int n, char *ip){ // 编码
    int i = 0;
    char num[5];
    int idx = 0;
    int idx2 = 0;
    for(;i<strlen(ip);){
        if(ip[i++] == '.'){
            idx = 0;
            int inum = atoi(num);
            dec_to_bin(inum, n, idx2);
            num[0]='\0';
            num[1]='\0';
            num[2]='\0';
            idx2 += 8;
            continue;
        }
        num[idx++] = ip[i-1];
    }
    int inum =  atoi(num);
    dec_to_bin(inum, n, idx2);
}

void decode(int *r, FILE *fout){ // 解码
    int idx = 8;
    for(;idx<33;){
        int num = 0;
        for(int i=idx - 8;i<idx;i++){
            num += pow(2, idx-i-1) * r[i];
        }
        fprintf(fout, "%d", num);
        if(idx != 32) fprintf(fout, ".");
        //else
        idx += 8;
    }

}

void printcode(int n){ //debug用
    for(int i=0;i<n;i++){
        for(int j=0;j<32;j++){
            if(j%8==0) printf("|");
            printf("%d", code[i][j]);
        }
        printf("\n");
    }
}

int main(){
    int n;
    if(DEBUG){
        fin = fopen("data.in", "rb");
        fout = fopen("data.out", "wb");
    }else{
        fin = stdin;
        fout = stdout;
    }
    int flag = 0;
    while(fscanf(fin, "%d", &n) != EOF){
        //if(flag) fprintf(fout, "\n");
        flag = 1;
        memset(code, 0, sizeof(code));
        char ip[16];
        int n2 = n;
        while(n2--){
            fscanf(fin, "%s", ip);
            encode(n2, ip);
        }
        //printcode(n);
        int result[32];
        memset(result, 0, sizeof(result));
        for(int i=0; i<n; i++){
            for(int j=0; j<32; j++){
                result[j] += code[i][j];
            }
        }
        
        int jdx = 0; //记录不同的位置
        for(; jdx<32; jdx++){
            if(result[jdx] != 0 && result[jdx] != n) break;
        }
        //最小IP
        for(int j=0; j<32; j++){
            if(j<jdx) result[j] = code[0][j];
            else result[j] = 0;
        }
        decode(result,fout);
        fprintf(fout, "\n");
        //子网掩码
        for(int j=0; j<32; j++){
            if(j<jdx) result[j] = 1;
            else result[j] = 0;
        }
        decode(result,fout);
        fprintf(fout, "\n");
    }

    if(DEBUG){
        fclose(fin);
        fclose(fout);
    }
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文