本题主要涉及字符串操作和二进制与十进制转换之间的问题,难度其实不算大。
#include <string>
#include <iostream>
#include <vector>
#include <cmath>
#include <sstream>
using namespace std;
long long transfer_dec(string &s) {
istringstream is(s);
string temp;
vector<string> seg;
while (getline(is, temp, '.')) seg.push_back(temp);
string ss;
for (int i = 0; i < seg.size(); i++) {
int val = stoi(seg[i]);
// 将十进制转换为二进制
int rem = val % 2;
val /= 2;
ss = ss + to_string(rem);
while (val != 0) {
rem = val % 2;
val /= 2;
ss = ss + to_string(rem);
}
string ss_reverse;
if (ss.size() != 8) {
// 不足8位,需要补零
int num = 8 - ss.size();
for (int k = 0; k < num; k++) {
ss_reverse = ss_reverse + "0";
}
}
// 逆序取出二进制
for (int j = ss.size() - 1; j >= 0; j--) {
ss_reverse = ss_reverse + ss[j];
}
seg[i] = ss_reverse;
ss.clear();
ss_reverse.clear();
}
string dec_seg;
for (vector<string>::iterator iter = seg.begin(); iter != seg.end(); iter++) {
dec_seg = dec_seg + *iter;
}
// 将二进制转换为十进制
long long dec_val = 0;
for (int i = dec_seg.size() - 1; i >= 0; i--) {
dec_val += stoi(string(1, dec_seg[i])) * pow(2, dec_seg.size() - 1 - i);
}
return dec_val;
}
string transfer_IP(string &s) {
long long dec_val = stoll(s);
// 将十进制转换为二进制
string ss;
int rem = dec_val % 2;
dec_val /= 2;
ss = ss + to_string(rem);
while (dec_val != 0) {
rem = dec_val % 2;
dec_val /= 2;
ss = ss + to_string(rem);
}
string ss_reverse;
if (ss.size() != 32) {
// 不足32位,需要补零
int num = 32 - ss.size();
for (int k = 0; k < num; k++) {
ss_reverse += "0";
}
}
for (int j = ss.size() - 1; j >= 0; j--) {
ss_reverse += ss[j];
}
// 每八段划分一次
vector<string> seg;
for (int i = 0; i < 4; i++) {
string temp = ss_reverse.substr(i * 8, 8);
seg.push_back(temp);
temp.clear();
}
// 将二进制转换为十进制
vector<int> dec;
int sum = 0;
for (int i = 0; i < 4; i++) {
string s_temp = seg[i];
for (int i = s_temp.size() - 1; i >= 0; i--) {
sum += stoi(string(1, s_temp[i])) * pow(2, s_temp.size() - 1 - i);
}
dec.push_back(sum);
sum = 0;
}
string res;
for (int i = 0; i < 4; i++) {
string temp = to_string(dec[i]);
res += temp;
temp.clear();
if (i != 3) res = res + ".";
}
return res;
}
int main() {
string s1, s2;
getline(cin, s1, '\n');
getline(cin, s2, '\n');
long long res1 = transfer_dec(s1);
string res2 = transfer_IP(s2);
cout << res1 << endl;
cout << res2 << endl;
return 0;
}
京公网安备 11010502036488号