题解 | #整数与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")

全部评论

相关推荐

点赞 评论 收藏
分享
03-10 20:35
已编辑
武汉大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务