摘要:
一道基于字符串的进制转换问题。
题目
描述
原理: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地址
示例1
输入:
10.0.3.193
167969729
输出:
167773121
10.3.3.193
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
inline ull s_to_ul_hi(string &s) { return bitset<32>(s).to_ullong(); }
inline ull s_to_ul_lo(string &s) { return bitset<8>(s).to_ullong(); }
inline string to_bin_string_hi(ull &x) { return bitset<32>(x).to_string(); }
inline string to_bin_string_lo(ull &x) { return bitset<8>(x).to_string(); }
inline void num_to_ip(ull &num) { string bin_str = to_bin_string_hi(num); string each = ""; for (int i = 0, n = bin_str.size(); i < n; i++) { if ((i + 1) % 8 == 0) { each += bin_str[i]; cout << s_to_ul_lo(each); if (i != n - 1) cout << '.'; each = ""; } else { each += bin_str[i]; } } cout << endl; }
inline void ip_to_num(string &ip) { string bin_num = ""; ull x = 0; for (int i = 0, n = ip.size(); i < n; i++) { int j = i; for (; j < n && ip[j] != '.'; j++) { x = x * 10 + (ip[j] - '0'); } i = j; bin_num += to_bin_string_lo(x); x = 0; } cout << s_to_ul_hi(bin_num) << endl; }
inline void solve(string &ip, ull &num) { ip_to_num(ip); num_to_ip(num); }
int main() { string ip; for (; cin >> ip;) { ull num; cin >> num; solve(ip, num); } return 0; }
|