半数单集问题
时间: 1ms 内存:64M
描述:
给定一个自然数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)中的元素个数。
输入:
多组测试数据,每行1个n,最后以0结束(1≤n≤200)
输出:
输出半数集set(n)中的元素个数。
示例输入:
6
0
示例输出:
6
提示:
参考答案(内存最优[804]):
#include<stdio.h>
#include<string.h>
int a[1000];
int prog(int k)
{
int i,s;
if(a[k]) return a[k];
s=1;
for(i=1;i<=k/2;i++)
{
s+=prog(i);
if(i>10&&(i/10<=(i%10)/2))
s-=prog(i/10);
}
a[k]=s;
return a[k];
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
memset(a,0,sizeof(a));
a[1]=1;
printf("%d\n",prog(n));
}
return 0;
}
参考答案(时间最优[8]):
#include<stdio.h>
#include<string.h>
int a[1000];
int prog(int k)
{
int i,s;
if(a[k]) return a[k];
s=1;
for(i=1;i<=k/2;i++)
{
s+=prog(i);
if(i>10&&(i/10<=(i%10)/2))
s-=prog(i/10);
}
a[k]=s;
return a[k];
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
memset(a,0,sizeof(a));
a[1]=1;
printf("%d\n",prog(n));
}
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。