华为机试:整数与IP地址间的转换
一、题目:
描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成 一个长整数。 举例:一个ip地址为10.0.3.193 每段数字 相对应的二进制数 10 00001010 0 00000000 3 00000011 193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
本题含有多组输入用例,每组用例需要你将一个ip地址转换为整数、将一个整数转换为ip地址。
输入描述:
输入 1 输入IP地址 2 输入10进制型的IP地址
输出描述:
输出 1 输出转换成10进制的IP地址 2 输出转换后的IP地址
二、输入输出示例:
三、代码:
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
#include<sstream>
int main()
{
string s;
unsigned int num;
vector<string> v1;
vector<int>v2,v3;
while (cin>>s>>num)
{
unsigned int res1 = 0;
string res2 = "";
v1.push_back("");
int flag1 = 0;
for (int i = 0; i < s.size(); i++)
{
if (s[i] != .)
{
v1[flag1] += s[i];
}
else
{
v1.push_back("");
flag1++;
}
}
for (int i = 0; i < v1.size(); i++)
{
int temp = 0;
int flag2 = v1[i].size() - 1;
for (int j = 0; j < v1[i].size(); j++)
{
temp += (v1[i][j] - 0) * pow(10, flag2--);
}
v2.push_back(temp);
}
for (int i = 0; i < v2.size(); i++)
{
int flag2 = (v2.size() - (i + 1)) * 8;
if (v2[i] != 0)
{
while (v2[i] != 1)
{
res1 += (v2[i] % 2) * pow(2, flag2);
flag2++;
v2[i] /= 2;
}
if (v2[i] == 1)
{
res1 += pow(2, flag2);
}
}
}
cout << res1 << endl;
if (num != 0)
{
while (num != 1)
{
v3.push_back(num % 2);
num /= 2;
}
if (num == 1)
{
v3.push_back(1);
}
}
else
{
cout << 0 << endl;
}
if (v3.size() % 8 != 0)
{
v3.resize((v3.size() / 8 + 1) * 8);
}
reverse(v3.begin(), v3.end());
int flag3 = 0;
for (int i = 0; flag3 < v3.size(); i++)
{
int res = 0;
for (int j = 7; j >= 0; j--)
{
res += v3[flag3++] * pow(2, j);
}
stringstream temp1;
string temp2;
temp1 << res;
temp1 >> temp2;
res2 += temp2;
if (flag3 < v3.size())
{
res2 += .;
}
}
cout << res2 << endl;
v1.clear();
v2.clear();
v3.clear();
}
system("pause");
return 0;
}
下一篇:
黑马redis实战-项目部署
