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

京公网安备 11010502036488号