本题主要涉及字符串操作和二进制与十进制转换之间的问题,难度其实不算大。
#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; }