这道题问现在的移动端的DeepSeek不给任何方向直接问,深度思考将近8分钟,给了方向(直接算进位)能缩短到一半。。。

这题的确很难,但是思路比较简单,先分离出两个火星数的每一位,不足的高位补0,然后从低位开始算进位,最后逆序输出结果

#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;

int main() {
    int prime[26] = { 0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };

    string A, B;
    while (cin >> A >> B) {
        //从前往后收集两个火星数的每一位
        vector<int> marsA;
        size_t pos = 0;
        while ((pos = A.find(',')) != string::npos) {
            marsA.push_back(stoi(A.substr(0, pos)));
            A.erase(0, pos + 1);
        }
        marsA.push_back(stoi(A));   // 将最后一位即个位加入数组

        vector<int> marsB;
        while ((pos = B.find(',')) != string::npos) {
            marsB.push_back(stoi(B.substr(0, pos)));
            B.erase(0, pos + 1);
        }
        marsB.push_back(stoi(B));

        // 在高位插入0补齐位数
        while (marsA.size() < marsB.size()) {
            marsA.insert(marsA.begin(), 0);
        }
        while (marsA.size() > marsB.size()) {
            marsB.insert(marsB.begin(), 0);
        }

        vector<int> ans;
        queue<int> cf; // 保存进位信息
        // 从个位开始进位
        int cnt = 1;
        auto it_a = marsA.rbegin();
        auto it_b = marsB.rbegin();
        for (; it_a != marsA.rend(), it_b != marsB.rend(); ++it_a, ++it_b) {
            int sum = *it_a + *it_b;  // 存储每位相加的和
            if (!cf.empty()) {  // 有进位信息
                sum += cf.front();
                cf.pop();
            }
            if (sum >= prime[cnt]) {
                ans.push_back(sum - prime[cnt]);
                cf.push(1);
            }
            else {
                ans.push_back(sum);
            }
            cnt++;
        }
        if (!cf.empty()) {
            ans.push_back(1);
        }

        // 输出结果
        reverse(ans.begin(), ans.end());
        for (auto it = ans.begin(); ; it++) {
            if (it == ans.end() - 1) {
                printf("%d", *it);
                break;
            }
            printf("%d,", *it);
        }
        printf("\n");
    }
    return 0;
}