Description
问题描述:
给定一个自然数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)中的元素个数。
Input
输入数据m行,每行给出一个整数n。(0〈n〈1000)
Output
输出只有m行,每行给出半数集set(n)中的元素个数。
Sample Input
6
99
Sample Output
6
9042
个人思路:
半数集:给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下:(1) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;(2)按
此规则进行处理,直到不能再添加自然数为止。
通过递归,求出符合条件的数量。定义全局变量,储存该数符合条件的值,避免重复计算。
示例代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
int num[1000] = {0};
int fun(n)
{
int i;
if(num[n] > 0)
{
return num[n];
}
else
{
for(i=1; i<=n/2; i++)
num[n] += fun(i);
num[n]++;
return num[n];
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt","r",stdin);
#endif // ONLINE_JUDGE
int n;
int result;
num[1] = 1;
while(scanf("%d", &n) != EOF)
{
result = fun(n);
printf("%d\n", result);
}
return 0;
}