题解 | #蛇形矩阵#

整数与IP地址间的转换

http://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea

/*

    关键在于2的31次方应该用long来表示

*/

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<math.h>

using namespace std;

int convert10(vector<int>& data,int s,int e) {
    int base = pow(2,7);
    int ans = 0;
    for(int i=s;i<=e;i++) {
        if(data[i]) {
            ans+=base;
        }
        base/=2;
    }
    return ans;

}

// 十进制转成2进制
void convert2(string& data,vector<int>& res) {
    int num = stoi(data);
    // 开始转换
    // 十进制开始转换二进制
    int base = pow(2,7);
    int index = 0;
    while(num>0 && index<8) {
        if(num>=base) {
            res[index]=1;
            num-=base;
        }
        index++;
        base/=2;
    }
}

void ip2num(string& ip) {
   auto iter = find(ip.begin(), ip.end(), '.');
    vector<int> ip_1(8);
    string data1(ip.begin(),iter);
//     cout<<"data1: "<<data1<<endl;
    convert2(data1, ip_1);

   auto iter2 = find(++iter, ip.end(), '.');
    vector<int> ip_2(8);
    string data2(iter,iter2);
//     cout<<"data2: "<<data2<<endl;
    convert2(data2, ip_2);

    auto iter3 = find(++iter2, ip.end(), '.');
    vector<int> ip_3(8);
    string data3(iter2,iter3);
//     cout<<"data3: "<<data3<<endl;
    convert2(data3, ip_3);

    vector<int> ip_4(8);
    string data4(++iter3,ip.end());
//     cout<<"data4: "<<data4<<endl;
    convert2(data4, ip_4);

   long base = pow(2,31);
   long res =0;
    for(int i=0;i<8;i++) {
        if(ip_1[i]) {
            res+=base;
        }
        base/=2;
    }
    for(int i=0;i<8;i++) {
        if(ip_2[i]) {
            res+=base;
        }
        base/=2;
    }
    for(int i=0;i<8;i++) {
        if(ip_3[i]) {
            res+=base;
        }
        base/=2;
    }
    for(int i=0;i<8;i++) {
        if(ip_4[i]) {
            res+=base;
        }
        base/=2;
    }    
    cout<<res<<endl;
}


void num2ip(long num) {
    vector<int> vec(32,0);
    long base =pow(2,31);
    int index = 0;
    while(num>0 && index<=31) {
//         cout<<num<<" "<<base<<" "<<index<<endl;
        if(num>=base) {
            vec[index]=1;
            num-=base;
        }

        index++;
        base/=2;
    }

    index =0;
    int sum = 0;
    cout<<convert10(vec, 0, 7)<<".";
    cout<<convert10(vec, 8, 15)<<".";
    cout<<convert10(vec, 16, 23)<<".";
    cout<<convert10(vec, 24, 31)<<endl;
}


// int ip2num(string& ip) {

// }

int main() {
    string ip;
    long num;
    while(cin>>ip) {
        cin>>num;
//         cout<<"ip: "<<ip<<endl;
        ip2num(ip);
        num2ip(num);
    }
}



全部评论

相关推荐

27届毕业,最近想找一段大厂实习,感觉简历有些问题,好多都不给面,求大佬们指点,最近好焦虑
后端劝退第91人:我从后端的角度分析一下你的第一个项目,我感觉亮点不是很突出。因为我是因为组内有需求,临时上手学react干活。我用到的技术基本就cover你那个智慧园区管理平台的很多亮点了。那作为比较专业的前端,你上述的内容是不是有点单薄呢。感觉还得包装
点赞 评论 收藏
分享
ResourceUt...:楼主有自己的垃圾箱,公司也有自己的人才库
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务