本题主要涉及字符串操作和二进制与十进制转换之间的问题,难度其实不算大。

#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;
}