题解 | #蛇形矩阵#
整数与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);
}
}
查看7道真题和解析
海康威视公司福利 1125人发布