问题描述:
给定一个自然数 n,由 n 开始可以依次产生半数集 set(n)中的数如下。 (1) n∈set(n); (2) 在 n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半; (3) 按此规则进行处理,直到不能再添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。半数集 set(6)中有 6 个元素。 注意半数集是多重集。
编程任务:
对于给定的自然数 n,编程计算半数集 set(n)中的元素个数。
数据输入:
每个输入包含若干行,每行给出一个整数 n。(0<n<1000) 直到0结束输入。
结果输出:
输出中每行输出半数集 set(n)中的元素个数。
样例输入:
1 2 6 0
样例输出:
1 2 6
代码(c++):
#include <bits/stdc++.h>
using namespace std;
int f[1000] = { 0 };
int setn(int n)
{
int a = 1;
if (f[n] > 0)
return f[n];
for (int i = 1; i <= n / 2; i++)
a += setn(i);
f[n] = a;
return a;
}
int main()
{
int n;
while(1)
{
cin >> n;
if(n == 0)
{
//TODO
break;
}
cout << setn(n) << endl;
}
return 0;
// cin >> n;
// cout << setn(n) << endl;
// return 0;
}