题目大意:给你一个N (0 < N < 10^5),把N分解成若干个不相同且值不超过10^5的整数的各个位数的和,例如:N=17时有,17 = 7 + 1 + 2 + 4 + 3,所以17可以分解成7, 12, 43,这三个不同的整数。

题目其实是比较简单的,解法也有很多种,我就说一个我认为比较有趣的解法。我们可以每次把N加到所求的整数集合里面,然后再把N减去自身各位数字的和得到新的N’,直到N等于零。正确性也很容易验证,注意到我们每次往集合里添加的数必然都是递减的,这就保证了无重复数字的出现,然后按照生成的规则可知,减到N为0的时候自然集合里的所有数的各位数字之和就为最初的N了。

其他解法:比如说先把1~99999,每个数的位数和算出来,然后排个序,然后就由大到小减等等。。。

烂烂的还是贴下代码。。。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>

using namespace std;

vector<int> v;
vector<int>::iterator its;

int ds(int x) {
int ret = 0;
while (x) {
ret += (x % 10);
x /= 10;
}
return ret;
}

int main() {
int n;
cin >> n;
while (n) {
v.push_back(n);
n -= ds(n);
}
cout << v.size() << endl;
for (its = v.begin(); its != v.end(); its++)
cout << *its << ' ';
cout << endl;
return 0;
}