题目描述
原理: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;
}