描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字相对应的二进制数
1000001010
000000000
300000011
19311000001
组合起来即为: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;
}
【机试编程题|HJ33 整数与IP地址间的转换】
推荐阅读
- 算法|2020 必学的10大顶级 Python 开源库
- 蓝桥杯|2022年蓝桥杯省赛真题解析(C++B组)
- c++|2022十三届蓝桥杯体验
- 蓝桥杯|浅谈2022第十三届蓝桥杯c/c++b组
- 令人快乐的刷题小妙招|【2022第十三届蓝桥杯】c/c++ 大学c组 解题报告
- YOLO|Ubuntu18.04配置darknet环境实现YOLOv4目标检测(五)——darknet YOLOv4和YOLOv4-tiny模型转ONNX转TensorRT部署
- c++|C++中关于进制输出的总结
- C++避坑指南|vector.earse()避坑指南(引发了异常: 读取访问权限冲突。_Mycont 是 nullptr。)
- c++|leetcode452之番外