题解 | #整数与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;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务