机试编程题|HJ33 整数与IP地址间的转换

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

数据范围:保证输入的是合法的 IP 序列

输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例1 输入:

10.0.3.193 167969729

复制输出:
167773121 10.3.3.193

#include #include #include #include std::string itoa(int num) { std::stringstream oss; oss << num; return oss.str(); }//数字字符串转二进制字符串10 std::string str2binary(std::string str) { if(str == "0") { return "00000000"; } std::string rtnStr; int num = atoi(str.c_str()); while(num > 0) { rtnStr += itoa(num % 2); num /= 2; } std::reverse(rtnStr.begin(), rtnStr.end()); int len = rtnStr.length(); switch (len) { case 1: rtnStr = "0000000" + rtnStr; break; case 2: rtnStr = "000000" + rtnStr; break; case 3: rtnStr = "00000" + rtnStr; break; case 4: rtnStr = "0000" + rtnStr; break; case 5: rtnStr = "000" + rtnStr; break; case 6: rtnStr = "00" + rtnStr; break; case 7: rtnStr = "0" + rtnStr; break; default: break; }return rtnStr; }long ipaddress2Integer(std::string ipaddress) { long rtnInter = 0; //返回的整数 std::string rtnStr; //二进制字符串 while(ipaddress.length() > 0) { int index = ipaddress.find('.'); if(index == -1) { rtnStr += str2binary(ipaddress); break; } std::string temp = ipaddress.substr(0, index); rtnStr += str2binary(temp); ipaddress = ipaddress.substr(index+1, ipaddress.length() - index - 1); }int powint = 0; for(int i = rtnStr.length()-1; i >=0; --i) { rtnInter += (rtnStr[i] - '0') * std::pow(2, powint); powint++; }return rtnInter; }//二进制字符串转换为整数 int str2Integer(std::string str) { int count; int powint = 0; for(int i = str.length()-1; i>=0; --i) { count += (str[i] - '0') * std::pow(2, powint); powint++; } return count; }//int转二进制字符串00001010000000000000001111000001 std::string int2IPAddress(long num) { std::string ipaddress; std::string rtnStr; while(num > 0) { ipaddress += itoa(num % 2); num /= 2; } while(ipaddress.length() < 32) { ipaddress += "0"; } std::reverse(ipaddress.begin(), ipaddress.end()); for(int i = 0; i < ipaddress.length(); i+=8) { std::string temp = ipaddress.substr(i, 8); int currentnum = str2Integer(temp); rtnStr += itoa(currentnum); rtnStr += "."; }return rtnStr.substr(0, rtnStr.length()-1); //去掉最后一位多与的点 }int main() { std::string ipaddress; std::cin >> ipaddress; long num; std::cin >> num; std::cout << ipaddress2Integer(ipaddress) << std::endl; std::cout << int2IPAddress(num) << std::endl; return 0; }

【机试编程题|HJ33 整数与IP地址间的转换】

    推荐阅读