【华为练习题】整数分隔
题目
整数分隔
描述: 一个整数总可以拆分为2的幂的和,例如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
总共有六种不同的拆分方式。
再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。
用f(n)表示n的不同拆分的种数,例如f(7)=6.
要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。
输入:
每组输入包括一个整数:N(1<=N<=1000000)。
输出:
对于每组数据,输出f(n)%1000000000。
输出有多行,每行一个结果。
输入数据如果超出范围,输出-1。
样例输入: 7
样例输出: 6
分析
用递归方式来寻找
解答
#include <string>
#include <vector>
using namespace std;
void findSum(int n, int index, vector<int> const &v, int &sum){
if (n < 0) return;
if (n == 0){
sum++;
sum %= 1000000000;
return;
}
for (int i = index; i < (int)v.size(); i++)
{
findSum(n - v[i], i, v, sum);
}
}
int main(){
int n;
while (cin >> n)
{
int i = 1, sum = 0;
vector<int> v;
while (i <= n)
{
v.push_back(i);
i *= 2;
}
findSum(n, 0, v, sum);
cout << sum << endl;
}
return 0;
}