题意:
输入IP地址,输出IP地址对应的10进制数;
输入10进制数,输出10进制数转换后的IP地址。
方法一:
模拟
思路:直接模拟,逐个遍历。
将IP地址转换为10进制数:将IP地址的每个十进制转为二进制串,再累加计算得到10进制数;
将10进制数转换为IP地址:将10进制数除二取余,计算出IP地址。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll sum=0;
string a;
void f(ll x){//将x转为二进制串
if(x==0)
return;
f(x/2);
a+=x%2+'0';
}
int main(){
string s1;
ll s2;
while(cin >> s1 >> s2){
a="";
sum=0;
s1+='.';
int len1=s1.size();
int x=0;
for(int i=0;i<len1;i++){//遍历
if(s1[i]=='.'){
a="";
f(x);
int m=8-a.size();
while(m--){//补前缀0
a='0'+a;
}
for(int j=0;j<8;j++){
sum=sum*2+a[j]-'0';//计算
}
x=0;
}else{
x=x*10+s1[i]-'0';//10进制数
}
}
cout << sum << endl;
a="";
f(s2);
int m=32-a.size();
while(m--){//补前缀0
a='0'+a;
}
for(int i=0;i<4;i++){//遍历输出
int y=0;
for(int j=0;j<8;j++){//每8个为一组
y=y*2+a[i*8+j]-'0';
}
printf("%d",y);
if(i!=3)
printf(".");
}
cout << endl;
}
return 0;
}
时间复杂度:
空间复杂度:![]()
方法二:
位运算
思路:位运算。
因为stringstream类是以空格为分隔符,所以将IP地址的变为空格。
然后利用位运算进行计算。
![]()
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
string s1;
ll s2;
while(cin >> s1 >> s2){
for(int i=0;i<s1.size();i++){
if(s1[i]=='.')
s1[i]=' ';
}
stringstream s(s1);//stringstream读取
int i=0;
ll x[4]={0};
while(s >> x[i++]);
cout << (x[0]<<24)+(x[1]<<16)+(x[2]<<8)+x[3] << endl;//计算10进制数
//位运算
ll a=s2>>24;
s2=s2-(s2>>24<<24);
ll b=s2>>16;
s2=s2-(s2>>16<<16);
ll c=s2>>8;
s2=s2-(s2>>8<<8);
ll d=s2;
printf("%d.%d.%d.%d\n",a,b,c,d);//计算IP
}
return 0;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号