【華為 OJ 】整數與IP地址間的轉換
阿新 • • 發佈:2019-01-30
原理: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
輸出例子:
167773121
10.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; }