top1编程
← 返回题目
题解

IP地址

1 条题解

  • 0
    @ 2026-8-5 15:42:10

    解题思路

    题目给我们一个 32 位的二进制串,要转换成“点分十进制”的 IP 地址,也就是每 8 位二进制转成一个十进制数,中间用点 . 隔开。

    怎么把 8 位二进制转成十进制呢?二进制从高位往低位看,比如 11000000:

    • 第 1 位是 1,表示有 128;
    • 第 2 位是 1,表示有 64;
    • 其余位都是 0。

    加起来就是 192。

    在程序里,我们用一个变量 v 累加,每读一位就做 v = v * 2 + (这一位)。比如:

    • 读 1:v = 0*2+1 = 1
    • 读 1:v = 1*2+1 = 3
    • 读 0:v = 3*2+0 = 6
    • 读 0:v = 6*2+0 = 12
    • ……最后得到 192。

    具体步骤:

    1. 外层循环 i 从 0 开始,每次跳 8 位,一共 4 段;
    2. 内层循环 j 从 0 到 7,把这一段的 8 位转成十进制数 v;
    3. 第一段前面不用加点,从第二段开始,输出数字前先输出一个 .;
    4. 输出 v。

    拿样例 11000000 10101000 00000000 00000001 来说,转换后是 192.168.0.1。

    参考代码

    // 用途:32位二进制串转换成点分十进制IP地址
    #include <iostream>
    #include <string>
    using namespace std;
    int main(){
        string s;
        cin>>s; // 32位二进制串
        for(int i=0;i<32;i+=8){ // 每8位一段,共4段
            int v=0;
            // 把一段8位二进制转换成十进制
            for(int j=0;j<8;j++) v = v*2 + (s[i+j]-'0');
            if(i>0) cout<<'.'; // 段与段之间用点隔开
            cout<<v;
        }
        cout<<endl;
        return 0;
    }
    

    复杂度分析

    • 时间:32 位二进制串每个字符只处理一次,总共 32 次操作,时间复杂度是 O(32),也就是常数时间。
    • 空间:只用一个字符串和一个整数变量,空间复杂度是 O(1)。
    • 1