HJ33 整数与IP地址间的转换

描述

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                   00001010
0                    00000000
3                    00000011
193                  11000001

组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

数据范围:保证输入的是合法的 IP 序列

输入描述:

输入 
1 输入IP地址
2 输入10进制型的IP地址

输出描述:

输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址

示例1

输入:

10.0.3.193
167969729

复制输出:

167773121
10.3.3.193
#include 
#include 
#include 
#include 


std::string itoa(int num)
{
    std::stringstream oss;
    oss << num;
    return oss.str();
}

//数字字符串转二进制字符串  10
std::string str2binary(std::string str)
{
    if(str == "0")
    {
        return "00000000";
    }
    std::string rtnStr;
    int num = atoi(str.c_str());
    while(num > 0)
    {
        rtnStr += itoa(num % 2);
        num /= 2;
    }
    std::reverse(rtnStr.begin(), rtnStr.end());
    int len = rtnStr.length();
    switch (len)
    {
    case 1:
        rtnStr = "0000000" + rtnStr;
        break;
    case 2:
        rtnStr = "000000" + rtnStr;
        break;
    case 3:
        rtnStr = "00000" + rtnStr;
        break;
    case 4:
        rtnStr = "0000" + rtnStr;
        break;
    case 5:
        rtnStr = "000" + rtnStr;
        break;
    case 6:
        rtnStr = "00" + rtnStr;
        break;
    case 7:
        rtnStr = "0" + rtnStr;
        break;
    
    default:
        break;
    }

    return rtnStr;
}

long ipaddress2Integer(std::string ipaddress)
{
    long rtnInter = 0;                       //返回的整数
    std::string rtnStr;                     //二进制字符串
    while(ipaddress.length() > 0)
    {
        int index = ipaddress.find('.');
        if(index == -1)
        {
            rtnStr += str2binary(ipaddress);
            break;
        }
        std::string temp = ipaddress.substr(0, index);
        rtnStr += str2binary(temp);
        
        ipaddress = ipaddress.substr(index+1, ipaddress.length() - index - 1);
    }

    int powint = 0;
    for(int i = rtnStr.length()-1; i >=0; --i)
    {
        rtnInter += (rtnStr[i] - '0') * std::pow(2, powint);
        powint++;
    }

    return rtnInter;
}

//二进制字符串转换为整数
int str2Integer(std::string str)
{
    int count;
    int powint = 0;
    for(int i = str.length()-1; i>=0; --i)
    {
        count += (str[i] - '0') * std::pow(2, powint);
        powint++;
    }
    return count;
}

//int转二进制字符串     00001010000000000000001111000001
std::string int2IPAddress(long num)
{
    std::string ipaddress;
    std::string rtnStr;
    while(num > 0)
    {
        ipaddress += itoa(num % 2);
        num /= 2;
    }
    while(ipaddress.length() < 32)
    {
        ipaddress += "0";
    }
    std::reverse(ipaddress.begin(), ipaddress.end());
    for(int i = 0; i < ipaddress.length(); i+=8)
    {
        std::string temp = ipaddress.substr(i, 8);
        int currentnum = str2Integer(temp);
        rtnStr += itoa(currentnum);
        rtnStr += ".";
    }

    return rtnStr.substr(0, rtnStr.length()-1);         //去掉最后一位多与的点
}

int main()
{
    std::string ipaddress;
    std::cin >> ipaddress;
    long num;
    std::cin >> num;

    std::cout << ipaddress2Integer(ipaddress) << std::endl;
    std::cout << int2IPAddress(num) << std::endl;

    return 0;
}

你可能感兴趣的:(机试编程题,c++)