题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
using namespace std;
/*原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
数据范围:保证输入的是合法的 IP 序列
10.0.3.193
167969729
167773121
10.3.3.193
*/
int twotopower(int n) //2的n次方
{
if (n==0)
{
return 1;
}
return 2 * twotopower(n - 1);
}
unsigned int ertoshi(string str)//二进制转10进制 11111111 11111111 11111111 11111111
{
unsigned int num=0;
if (str.length()==0)
{
return 1;
}
while (str.length() != 0)
{
if (stoi(str.substr(0, 1)) == 1) //该位为1
{
num+=twotopower(str.length()-1);
}
str = str.substr(1);
}
return num;
}
string shitoer(unsigned int num) //十进制转二进制 补足8位 在前面补齐0
{
vector<int> vec;
int i;
while (num > 1)
{
i = num % 2;
num /= 2;
vec.push_back(i);
}
vec.push_back(num);
string str;
for (auto iter = vec.rbegin(); iter != vec.rend();iter++)
{
str += to_string(*iter);
}
while (str.length() <8)
{
str = '0' + str;
}
return str;
}
unsigned int fun3(string str) //32位的二进制转10进制 ip->二进制->十进制
{
int n=4;
vector<int> vec; //储存ip地址的四位
string str1; //二进制字符串
while (n--)
{
//vec.push_back(stoi(str.substr(0, str.find('.')).data()));
str1 += shitoer(stoi(str.substr(0, str.find('.'))));
str = str.substr(str.find('.') + 1);
}
return ertoshi(str1);
}
string fun4(unsigned int num) //十进制转 ip地址 10进制-->二进制-->ip地址
{
int n = 4;
string strtwo; //表示二进制的字符串
string strvalue; //表示要输出的ip地址 字符串
strtwo = shitoer(num);
vector<int> vec; //储存ip地址
//把二进制字符串变成32位的
while (strtwo.length() != 32)
{
strtwo = '0' + strtwo;
}
//把他分割成八位,八位的
while (n--)
{
vec.push_back(ertoshi(strtwo.substr(0, 8)));
strtwo = strtwo.substr(8);
}
strvalue = to_string(vec[0]) + '.' + to_string(vec[1]) + '.'
+ to_string(vec[2]) + '.' + to_string(vec[3]);
return strvalue;
}
int main()
{
string str;
unsigned int idata; //这里使用无符号的int类型 否则数据会超出2^31多的部分就变成了负数
cin >> str;
cin >> idata;
cout << fun3(str) << endl;;
cout << fun4(idata) << endl;;
system("pause");
return 0;
}
