问题:
题目描述
给定一个自然数 n,由 n 开始可以依次产生半数集 set(n)中的数如下。
(1) n∈set(n);
(2) 在 n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
(3) 按此规则进行处理,直到不能再添加自然数为止。
例如,set(6)={6,16,26,126,36,136}。半数集 set(6)中有 6 个元素。 注意半数集是多重集。
输入输出格式
输入格式:
每个文件只有 1 行,给出整数 n。(0<n<1000)
输出格式:
输出文件只有 1 行,给出半 数集 set(n)中的元素个数。
输入输出样例
输入样例#1:
6
输出样例#1:
6
代码:
#include <stdio.h>
#include <stdlib.h>
int s[500];
int ban(int n)
{
int i,sum = 1;
if(s[n] > 0)//防止重复加
s[n] = sum;
for(i=1; i<=n/2; i++)
sum += ban(i);
s[n] = sum;
return sum;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",ban(n));
return 0;
}
小结:
题目看懂了就不算难了。