题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
#include <cstddef>
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
string dec_bin(unsigned int dec){
string result="";
list<int> temp;
int p;
while(dec){
p=dec%2;
dec=(dec-p)/2;
temp.push_front(p);
}
for(int i=0;i<8-temp.size();i++){
result+='0';
}
int size=temp.size();
for (int i=0;i<size; i++) {
result+=temp.front()+'0';
temp.pop_front();
}
// cout<<result<<endl;
return result;
}
void handling_ip(string str){
vector<string> temp;
int sub_str_len=0;
for(int i=0;i<str.size();i++){
if(str[i] != '.'){
sub_str_len++;
continue;
}
temp.push_back(str.substr(i-sub_str_len,sub_str_len));
sub_str_len=0;
}
if(temp.size()>0){
temp.push_back(str.substr(str.size()-sub_str_len,sub_str_len));
vector<int> vdec;
for(int i=0;i<temp.size();i++){
int size=temp[i].size();
int dec=0;
for(int j=0;j<size;j++){
dec+=(temp[i][j]-'0')*pow(10,size-j-1);
}
vdec.push_back(dec);
}
string sbin="";
//cout<<vdec[0]<<" "<<vdec[1]<<" "<<vdec[2]<<" "<<vdec[3]<<endl;
for(int i=0;i<vdec.size();i++){
sbin+=dec_bin(vdec[i]);
}
// cout<<sbin<<endl;
// int result=stoi(sbin,nullptr,2);
unsigned int result=0;
for(int i=0;i<sbin.size();i++){
result+=(sbin[i]-'0')*pow(2,sbin.size()-i-1);
}
cout<<result<<endl;
}
}
void handling_num(unsigned int num){
list<int> temp;
while(num){
int p=num%2;
num=(num-p)/2;
temp.push_front(p);
}
while(temp.size()<32){
temp.push_front(0);
}
int len=0;
vector<int> rel;
int add=0;
for(int i=0;i<32;i++){
if(len<8){
add+=temp.front()*pow(2,8-len-1);
len++;
temp.pop_front();
}
if(len==8){
rel.push_back(add);
add=0;
len=0;
}
}
cout<<rel[0]<<'.'<<rel[1]<<'.'<<rel[2]<<'.'<<rel[3]<<endl;
}
int main() {
string str;
int dec;
while (cin >> str) { // 注意 while 处理多个 case
size_t found=str.find('.');
if(found != string::npos){
handling_ip(str);
}else{
unsigned int num=atoi(str.c_str());
// cout<<num<<endl;
handling_num(num);
}
}
return 0;
}
// 64 位输出请用 printf("%lld")
查看1道真题和解析