该篇是讲给定一个数 n,让求最少有几个数能组合出 n 以内的所有数。
举个例子
给定一个n = 15
那么对于15内的所有数我们都可以用1 2 4 8来表示出来。
1 = 1
2 = 2
1 + 2 = 3
4 = 4
1 + 4 = 5
2 + 4 = 6
1 + 2 + 4 = 7
8 = 8
1 + 8 = 9
2 + 8 = 10
1 + 2 + 8 = 11
4 + 8 = 12
1 + 4 + 8 = 13
2 + 4 + 8 = 14
1 + 2 + 4 + 8 = 15
所以,15 就可以由1 2 4 8 组成
先考虑 n 为 -1 这种情况
那么 n 能分为 个数字
分为的数字也是有规律的,第i个数字就是 。
然后考虑 n 不为 -1 这种情况,比如 12
那么n能分为 下取整然后+1个数字
分为的数字前面 i-1 个和前面的一样,对于最后一个,我们可以用 求得
那么可以分成的数字是1 2 4 5
代码:
注意执行顺序
#include<iostream>
using namespace std;
int main ()
{
int n;
cin >> n;
int ans = 1;
int sum = 0;
while(sum < n) {
if(n - sum >= sum + 1)
cout << ans << endl;
else cout << n - sum << endl;
sum += ans;
ans = sum + 1;
}
return 0;
}
优化后的代码:
#include<iostream>
#include<vector>
using namespace std;
int main ()
{
int n;
cin >> n;
vector<int> a;
int i ;
for(i = 1; i <= n; i *= 2)
{
a.push_back(i);
n -= i;
}
if(n > 0) a.push_back(n);
for(auto j : a) printf("%d\n",j);
return 0;
}