先贴出本人未特判但是AC的代码
#include <iostream>
#include <vector>
#define endl '\n'
using namespace std;
vector<int> final;
int a[10010];
vector<int> mul(vector<int>& A, int b) {
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i++) {
if (i < A.size()) {
t += A[i] * b;
}
C.push_back(t % 10);
t /= 10;
}
while (C.size() > 1 && C.back() == 0) {
C.pop_back();
}
return C;
}
int main() {
int n, total = 0, cnt = 0;
cin >> n;
for (int i = 2; total < n; ++i) {
total += i;
a[cnt++] = i;
}
final.push_back(1);
for (int i = 0; i < cnt; ++i) {
if (a[i] == total - n) {
continue;
}
final = mul(final, a[i]);
cout << a[i] << " ";
}
cout << endl;
for (int i = final.size() - 1; i >= 0; --i) {
cout << final[i];
}
return 0;
}
此代码缺少对于total−n=1情况的特判,当输入53时,输出为:
2 3 4 5 6 7 8 9 10
3628800
而2加到10的值是54而非53
下面是重新提交的代码:
#include <iostream>
#include <vector>
#define endl '\n'
using namespace std;
vector<int> final;
int a[10010];
vector<int> mul(vector<int>& A, int b) {
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i++) {
if (i < A.size()) {
t += A[i] * b;
}
C.push_back(t % 10);
t /= 10;
}
while (C.size() > 1 && C.back() == 0) {
C.pop_back();
}
return C;
}
int main() {
int n, total = 0, cnt = 0;
cin >> n;
for (int i = 2; total < n; ++i) {
total += i;
a[cnt++] = i;
}
final.push_back(1);
if (total - n == 1) {
a[0] = a[cnt - 1] + 1;
cnt--;
sort(a, a + cnt);
}
for (int i = 0; i < cnt; ++i) {
if (a[i] == total - n) {
continue;
}
final = mul(final, a[i]);
cout << a[i] << " ";
}
cout << endl;
for (int i = final.size() - 1; i >= 0; --i) {
cout << final[i];
}
return 0;
}
当输入53时,输出为
3 4 5 6 7 8 9 11
1995840
才是正确答案
本题可加强任何形如(∑i=2ni)−1 的数据