题意:
输入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; }
时间复杂度:空间复杂度: