UVA 1590 IP Networks(模拟)
输入一堆IP地址
取出最长的公共前缀:
对这堆IP地址做且运算得到s,
枚举n从0-32
然后把IP地址和s截断前32-n位作比较作比较
网络地址:
网络掩码:前32-n位=最长公共前缀长度
每一个IP地址和网络地址做异或,检查1出现的位置,从左往右数出现的越迟,说明公共前缀越长,IP网络就越小
求出网络掩码0的个数,然后把s前面非0的位置保留,剩下的位置填充为0
模拟:字符转数字,数字转字符
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char all[1005][35]; int main() { //#define LOCAL #ifdef LOCAL freopen("in","r",stdin); freopen("out","w",stdout); #endif int net[4]; int m; char s[100]; int cnt , len , sum; int i,j,n,k; while(cin>>m){ for(i=0;i<4;i++) net[i] = 255; for(i=0;i<m;i++){ cin>>all[i]; len = strlen(all[i]); cnt = 0 ; sum = 0; for(j=0;j<=len;j++){ if(all[i][j]=='.'||all[i][j]=='\0'){ net[cnt]&=sum; sum = 0; cnt++; }else{ sum = sum*10+all[i][j]-48; } } } int first = 1; /* for(i=0;i<4;i++){ if(first) first = 0; else cout<<"."; cout<<net[i]; } cout<<endl; */ //最长 公共前缀 int t[4]; int ans = -1; for(i=0;i<m;i++){ len = strlen(all[i]); cnt = 0; sum = 0; for(j=0;j<=len;j++){ if(all[i][j]=='.'||all[i][j]=='\0'){ t[cnt] = net[cnt]^sum; sum = 0; cnt++; }else{ sum = sum*10+all[i][j]-48; } } for(j=0;j<4;j++){ if(t[j]) break; } //for(j=0;j<4;j++) cout<<t[j]<<" ";cout<<endl; //n=0; if(j==4) n=0; else{ if(j==3) n=0; else n = (3-j)*8; for(k=7;k>=0;k--){ if(t[j]&(1<<k)) break; } n+=k+1; } //cout<<"n:"<<n<<endl; if(n>ans) ans = n; } //保留s的前32-ans位 int f=0,number; cnt=0; for(i=0;i<32;i++){ if(i>=0&&i<32-ans) number = 1; else number = 0; sum = sum*2+number; cnt++; if(cnt==8){ net[f] &= sum; f++; sum=0; cnt=0; } } first = 1; for(i=0;i<4;i++){ if(first) first = 0; else cout<<"."; cout<<net[i]; } cout<<endl; //cout<<ans<<endl; if(ans==0) cout<<"255.255.255.255"<<endl; else{ for(i=0;i<32-ans;i++) s[i] = '1'; for(i=32-ans;i<32;i++) s[i] = '0'; s[i] = '\0'; cnt = 0; first = 1; for(i=0;i<32;i++){ sum = sum*2+s[i]-'0'; cnt++; if(cnt==8){ if(first) first = 0; else cout<<"."; cout<<sum; cnt = 0; sum = 0; } } cout<<endl; } } return 0; } /* Input 2 0.0.0.0 255.255.255.255 2 1.1.1.1 1.1.1.1 2 1.2.3.4 1.2.3.12 Output 0.0.0.0 0.0.0.0 1.1.1.1 255.255.255.255 1.2.3.0 255.255.255.240 */

浙公网安备 33010602011771号