半数单集问题

半数单集问题

时间: 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;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注