1. 程式人生 > >UVa1590 找最小子網掩碼,和子網ip

UVa1590 找最小子網掩碼,和子網ip

/*
* 20171214
*/

/*
注意:
1,數字沒有前導零,數字長度不一;
2,數字會出現0的情況;
3,注意初始化陣列,因為要用0來結束字串;
*/

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define maxn 1005

char str[maxn][40];
int m;

int translateB(char* s,int l)
{
    int t = 0;
    for(int i=0;i<l;i++)
    {
        t*=10
; t+=(*(s+i)-'0'); } return t; } void translateA(char* s,int t) { for(int i=7;i>=0;i--) { s[i] = t%2 + '0'; t>>=1; } } void translate(char* s,int l,char* t) { int f[5]; int tl[5]; memset(f,0,sizeof(f)); memset(tl,0,sizeof(tl)); int
cnt = 0; for(int i=0;i<l;i++) { if(t[i] == '.') { cnt++; f[cnt] = i+1; }else{ tl[cnt]++; } } for(int i=0;i<4;i++) translateA(s+i*8,translateB(t+f[i],tl[i])); } int solve(char* a,char* b) { for(int i=0;i<32
;i++) { if(a[i] != b[i]) return i; } return 32; } int itranslateB(char* s) { int t = 0; for(int i=0;i<8;i++) { t<<=1; t+=(*(s+i)&1); } return t; } void itranslateA(char* a,int& l,int b) { if(b>=100) { *(a+l++) = b/100 + '0'; *(a+l++) = (b/10)%10 + '0'; *(a+l++) = b%10 + '0'; }else if(b>=10) { *(a+l++) = b/10 + '0'; *(a+l++) = b%10 + '0'; }else { *(a+l++) = b%10 + '0'; } } void itranslate(char* a,char* b) { int l = 0; for(int i=0;i<4;i++) { if(i!=0){ *(a+l) = '.'; l++; } itranslateA(a,l,itranslateB(b+i*8)); } } int main() { //freopen("input.txt","r",stdin); //freopen("ans.txt","w",stdout); while(scanf("%d",&m)!=EOF) { memset(str,0,sizeof(str)); for(int i=0;i<m;i++) { char t[40]; scanf("%s",t); int l = strlen(t); translate(str[i],l,t); } int ans = 32; for(int i=0;i<m;i++) for(int j=0;j<m;j++) { int l = solve(str[i],str[j]); ans = min(ans,l); } for(int i=ans;i<32;i++) str[0][i] = '0'; char res[40]; memset(res,0,sizeof(res)); for(int i=0;i<ans;i++) res[i] = '1'; for(int i=ans;i<32;i++) res[i] = '0'; char resA[40]; char resB[40]; memset(resA,0,sizeof(resA)); memset(resB,0,sizeof(resB)); itranslate(resA,str[0]); itranslate(resB,res); printf("%s\n%s\n",resA,resB); } return 0; }