这道题问现在的移动端的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; }