UVa1590

该程序实现将IP地址转化为二进制,并计算共同前缀,从而得出子网掩码。通过输入IP地址数量及每个地址,程序会输出相应的子网掩码和网络地址。
/*
这道题的思路很简单就是,就是先把ip地址转成二进制,
然后比较二进制的共同前缀,
最后根据共同前缀计算子网掩码即可
本质上的功能就是把十进制的string和二进制的string的相互转换
*/
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include<string>
#include<strstream>
#include<strstream>
#include <sstream>
using namespace std;
//int转成string
string itod(int i){
    stringstream ss;
    ss<<i;
    return ss.str();
}
//int转成二进制string

string itos(int i){
    string s;
    while(i){
        s.push_back(i%2+'0');
        i/=2;
    }
    while(s.size()<8)s.push_back('0');
    reverse(s.begin(),s.end());
    return s;
}
//把string类型的ip地址转换成二进制string

string stob(string s){
    string ans;
    string::size_type now=0,next=0;
    while(now<s.size()){
        next=s.find('.',now);
        if(next==string::npos)next=s.size();
        int num=stoi(s.substr(now,next-now));
        ans+=itos(num);
        now=next+1;
    }
    return ans;
}
//计算两个二进制ip地址串的共同前缀,pos是共同前缀长度
//这中间要注意一定要计算共同前缀长度,因为直接把本次共同前缀之后的ans赋值为0的话,
//下一次计算的ans和now的共同前缀时候,有可能now的pos之后部分为0.这样导致错误。
int comm(string &a,string &b,int len){
    int pos=0;
    while(pos<len&&a[pos]==b[pos])++pos;
    return pos;
}
void ins(string &s){
    int num;
    string ans;
    for(int i=0;i<4;++i){
        if(i)ans.push_back('.');
        num=stoi(s.substr(i*8,8),nullptr,2);
        ans+=itod(num);
    }
    cout<<ans<<endl;
}

int main()
{
    int m,len;
    while(scanf("%d",&m)!=EOF&&m){
        len=32;
        string ans,now,tmp;
        for(int i=0;i<m;++i){
            cin>>tmp;
            now=stob(tmp);
            if(i==0)ans=now;
            len=comm(ans,now,len);
        }
        for(int i=len;i<32;++i)ans[i]='0';
        for(int i=0;i<32;++i)now[i]=i<len?'1':'0';
        ins(ans);
        ins(now);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值