题解 | #火星A+B#
火星A+B
https://www.nowcoder.com/practice/46bb070835e548678c78477f1fb0b92e
#include <iostream>
#include <vector>
using namespace std;
int a[26];//存储前25个素数
bool is_prime(int n) {
if (n == 1) return false;
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) return false;
}
return true;
}
void func() {
for (int i = 2, index = 0; index < 26; i++) {
if (is_prime(i)) a[index++] = i;
}
}
vector<int> add(vector<int>& A, vector<int>& B) {
int t = 0;
vector<int> C;
for (int i = 0; i < A.size() || i < B.size(); i++) {
if (i < A.size()) t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % a[i]);
t /= a[i];
}
if (t) C.push_back(t); //最高位进位不要忘记
return C;
}
int main() {
//预处理素数数组
func();
// for (int i = 0; i < 26; i++) cout << a[i] << " ";
// cout << endl;
string a, b;
cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i--) {
if (isdigit(a[i])) {
int j = i;
while (j >= 0 && isdigit(a[j])) j--;
//j+1~i是一个数字
int num = 0;
for (int k = j + 1; k <= i; k++) num = 10 * num + a[k] - '0';
A.push_back(num);
i = j + 1; //因为i--以后指向下一个逗号
}
}
for (int i = b.size() - 1; i >= 0; i--) {
if (isdigit(b[i])) {
int j = i;
while (j >= 0 && isdigit(b[j])) j--;
//j+1~i是一个数字
int num = 0;
for (int k = j + 1; k <= i; k++) num = 10 * num + b[k] - '0';
B.push_back(num);
i = j + 1; //因为i--以后指向下一个逗号
}
}
vector<int> res = add(A, B);
for(int i=res.size()-1;i>=0;i--){
cout<<res[i];
if(i==0) break;
cout<<",";
}
return 0;
}
