Uva 1590 IP Networks的一个问题
题目:https://vjudge.net/problem/UV...
uDebug:https://www.udebug.com/UVa/1590
uDebug测试样例都过了,可是提交还是WA,不知道问题出在哪里了,不知道是否有大神能帮忙看看。
思路
- 将IP地址(二维数组)全转换为二进制表示,然后全部相加成一个一维数组,然后遍历一维数组,如果遇到不是0或者不是总IP地址数,说明从这位开始便不同,记录位置
- 然后遍历到这位之前的ip不变,后面补零便为最小IP
- 遍历到这位之前的ip全为1,后面补零便为子网掩码
- 转换成十进制输出即可
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论