原理: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地址
输入例子:
10.0.3.193 167969729
输出例子:
16777312110.3.3.193
#include <iostream> #include <string.h> #include <vector> using namespace std; vector <int> fun(long num) { vector <int> vec1; int n; while (num) { n = num % 2; vec1.push_back(n); num /= 2; } while (vec1.size() % 8 != 0) { vec1.push_back(0); } return vec1; } int main() { char str[1000]; while (cin >> str) { long a; cin >> a; vector <int> vec1; vector <int> vec2; vector <char*> vec; char* p = strtok(str, "."); while (p) { vec.push_back(p); p = strtok(NULL, "."); } int m, n; for (int i = vec.size()-1; i >= 0; i--) { m = atoi(vec[i]);//切割后是字符串,要转换为数字才能使用 if (m == 0) vec1.push_back(m); else { while (m) { n = m % 2; vec1.push_back(n); m /= 2; } } while (vec1.size() % 8!=0) { vec1.push_back(0); } } long sum = 0; for (int i = vec1.size() - 1; i >= 0; i--) { sum =sum*2+ vec1[i];二进制转为十进制,两次倒序后为正序 } cout << sum << endl; vec1 = fun(a); int c = 0, d = 0; for (int i = vec1.size() - 1; i >= 0; i--) { c++; d = d * 2 + vec1[i]; if (c % 8 == 0) { vec2.push_back(d); d = 0; } } for (int i = 0; i < vec2.size()-1; i++) cout << vec2[i] << "."; cout << vec2[vec2.size() - 1]; cout << endl; } return 0; }