题解
IP地址
1 条题解
-
0
解题思路
IPv4 地址是一个 32 位的二进制数,为了方便记忆,我们把它每 8 位一段,分成 4 段,每一段转成十进制数,段与段之间用小数点
.隔开。这种写法就叫"点分十进制表示法"。具体做法:
- 读入 32 位的二进制字符串 s。
- 用 for 循环处理 4 段(k 从 0 到 3),第 k 段的 8 位是
s[k*8] ~ s[k*8+7]。 - 把这一段的 8 位二进制数累加成十进制值 v:
v = v * 2 + (s[k*8+j] - '0')。 - 输出:不是第一段时先输出一个
.,再输出这一段的值。
用样例验证:
11000000 10101000 00000000 0000000111000000→ 128+64=19210101000→ 128+32+8=16800000000→ 000000001→ 1
结果就是
192.168.0.1,和样例一致。参考代码
#include <iostream> using namespace std; // 用途:把32位二进制IP地址转换成点分十进制表示法 int main() { string s; cin >> s; // 读入32位二进制串 for (int k = 0; k < 4; k++) { // 共4段,每段8位 int v = 0; for (int j = 0; j < 8; j++) // 把这一段8位二进制数转成十进制值 v = v * 2 + (s[k * 8 + j] - '0'); if (k > 0) cout << '.'; // 段与段之间用点隔开 cout << v; } cout << endl; return 0; }复杂度分析
- 时间复杂度:二进制串固定是 32 位,无论哪组数据都只处理 32 个字符,所以是 O(1),也就是固定的、很快的。
- 空间复杂度:只用一个字符串存输入,可以看作 O(1)。
因为位数固定,这道题无论怎么输入,运算量都一样小。
- 1