华为机试:整数与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实战-项目部署