题解
IP地址
1 条题解
-
0
解题思路
题目给我们一个 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。
具体步骤:
- 外层循环 i 从 0 开始,每次跳 8 位,一共 4 段;
- 内层循环 j 从 0 到 7,把这一段的 8 位转成十进制数 v;
- 第一段前面不用加点,从第二段开始,输出数字前先输出一个
.; - 输出 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