题目描述
IP地址是一个长度固定为 32 位 的 01 序列,给定一个IP地址,请将它转成点分十进制后输出。
点分十进制的转化方法如下:首先将IP地址分割成长度相等的四个二进制数字(每个二进制数字的长度为 8),然后将这些数字用十进制表示,中间用 .
分割。
例如某个IP地址为:11000000101010000000000101100100
,那么
11000000
对应十进制数字为192
10101000
对应十进制数字为168
00000001
对应十进制数字为1
01100100
对应十进制数字为100
这个IP地址的点分十进制表示为 192.168.1.100
。
输入格式
32个 01 字符:表示一个给定的IP地址
输出格式
一行字符:表示给定IP地址的点分十进制表示
样例数据
输入:
11000000101010000000000101100100
输出:
192.168.1.100
题解
本题关键点:利用二进制的算法分段计算,还要注意以字符串形式输入,然后字符转换成数字,代码如下。
#include <iostream>
#include <string>
using namespace std;
//计算2的n次方
int power(int n){
int ans=1;
while(n--){
ans*=2;
}
return ans;
}
int main(){
string s;
int a,b,c,d,len,sum,sum2,sum3,sum4;
cin>>s;
len=s.length();
a=7;
b=7;
c=7;
d=7;
sum=0;
sum2=0;
sum3=0;
sum4=0;
for(int i=0;i<len;i++){
if(i<8){
if(s[i]-'0'==1){
sum+=power(a);
}
a--;
}else if(i>=8 && i<16){
if(s[i]-'0'==1){
sum2+=power(b);
}
b--;
}else if(i>=16 && i<24){
if(s[i]-'0'==1){
sum3+=power(c);
}
c--;
}else{
if(s[i]-'0'==1){
sum4+=power(d);
}
d--;
}
}
cout<<sum<<"."<<sum2<<"."<<sum3<<"."<<sum4;
return 0;
}