测试样例:
输入:
3
194.85.160.177
194.85.160.183
194.85.160.178
2
192.0.1.2
192.0.1.0
1
192.0.0.1
输出:
194.85.160.176
255.255.255.248
192.0.1.0
255.255.255.252
192.0.0.1
255.255.255.255
AC代码:
//#define LOCAL
#include <bits/stdc++.h>
using namespace std;
//将数字转换为二进制
string to_btye(int x){
string s="";
while(x){
if(x%2==0)s='0'+s;
else s='1'+s;
x=x>>1;
}
while(s.size()!=8)s='0'+s; //未满8b 用0补齐
return s;
}
//将输入的字符串转换为只含 0 1 的字符串
string change(string s){
int i=0;
int temp=0;
int len=s.size();
string ans="";
while(i<len){
if(s[i]!='.'){
temp=temp*10+s[i]-'0';
}else{
string b=to_btye(temp);
ans=ans+b;
temp=0;
}
i++;
}
ans=ans+to_btye(temp);
return ans;
}
int main(){
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
int n;
while(cin>>n){
vector<string>v;
for(int i=0;i<n;i++){
string s;cin>>s;
string temp=change(s);
v.push_back(temp);
}
int minn=0;
int mask=0;
vector<int>ans;
vector<int>ans2;
int i=0; //前 i 个字符相同
//确定i
for(;i<32;i++){
char c=v[0][i];
if(i%8==0&&i){
ans.push_back(minn);
ans2.push_back(255);
minn=0;
mask=0;
}
int j=1;
for(;j<n;j++){
if(v[j][i]!=c)break;
}
if(j<n){
break;
}else {
if(c=='1')minn=(minn<<1)+1;
else minn=minn<<1;
mask=(mask<<1)+1;
}
}
if(i==32){
ans.push_back(minn);
ans2.push_back(255);
}else {
//未满8b 用 0 补齐
int k=i%8;
while(k<8){
minn=minn<<1;
mask=mask<<1;
k++;
}
ans.push_back(minn);
ans2.push_back(mask);
}
//若不满4个数 用 0 补 --> 方便输出
while(ans.size()<4){
ans.push_back(0);
ans2.push_back(0);
}
//输出
for(int j=0;j<ans.size();j++){
if(j)cout<<".";
cout<<ans[j];
}
cout<<endl;
for(int j=0;j<ans2.size();j++){
if(j)cout<<".";
cout<<ans2[j];
}
cout<<endl;
}
}