整数与IP地址间的转换/华为机试(C/C++)

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/thecentry。 https://blog.csdn.net/thecentry/article/details/82533373

题目描述

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

的每段可以看成是一个0-255的整数,需要对IP地址进行校验

输入描述:

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

输出描述:

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

示例1

输入

10.0.3.193
167969729

输出

167773121
10.3.3.193

代码:

//第三十三题 整数与IP地址间的转换
#include<iostream>
#include<string>
using namespace std;
void TransferIp(string src)
{
	int iNum[4]{ 0 };
	size_t sPosition = 0, ePsition;
	int k = 0;
	while ((ePsition = src.find('.', sPosition)) != string::npos)
	{
		string temp = src.substr(sPosition, ePsition);
		int iTemp = atoi(temp.data());
		if (iTemp > 255)
			return;
		else
			iNum[k] = iTemp;
		k++;
		sPosition = ePsition + 1;
	}
	if (k != 3)
		return;
	else
	{
		string temp = src.substr(sPosition, src.length()-sPosition);
		int iTemp = atoi(temp.data());
		if (iTemp > 255)
			return;
		else
			iNum[3] = iTemp;
	}
	size_t iOut = iNum[0];
	for (int i = 1; i < 4; i++)
	{
		iOut = iOut * 256 + iNum[i];
	}
	cout << iOut << endl;
	return;
}
void TransferToIp(size_t src)
{
	int iNum[4]{ 0 };
	size_t sT = (src >> 8);
	for (int i = 0; i < 4; i++)
	{
		iNum[i] = src - (sT << 8);
		src = sT;
		sT = sT >> 8;
	}
	string sOut;
	for (int i = 3; i > 0 ; i--)
	{
		string temp = to_string(iNum[i]);
		sOut += temp + '.';
	}
	sOut += to_string(iNum[0]);
	cout << sOut.c_str() << endl;
}
int main()
{
	string inStr;
	size_t sNum;
	while (cin >> inStr >> sNum)
	{
		TransferIp(inStr);
		TransferToIp(sNum);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/thecentry/article/details/82533373