top1编程
← 返回题目
题解

IP地址

1 条题解

  • 0
    @ 2026-8-5 12:17:20

    解题思路

    IPv4 地址是一个 32 位的二进制数,为了方便记忆,我们把它每 8 位一段,分成 4 段,每一段转成十进制数,段与段之间用小数点 . 隔开。这种写法就叫"点分十进制表示法"。

    具体做法:

    1. 读入 32 位的二进制字符串 s。
    2. 用 for 循环处理 4 段(k 从 0 到 3),第 k 段的 8 位是 s[k*8] ~ s[k*8+7]。
    3. 把这一段的 8 位二进制数累加成十进制值 v:v = v * 2 + (s[k*8+j] - '0')。
    4. 输出:不是第一段时先输出一个 .,再输出这一段的值。

    用样例验证:11000000 10101000 00000000 00000001

    • 11000000 → 128+64=192
    • 10101000 → 128+32+8=168
    • 00000000 → 0
    • 00000001 → 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