zoukankan      html  css  js  c++  java
  • 半数集问题

    问题描述:
    给定一个自然数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)中的元素个数。

    eg:set(6) , 在6的左边加上一个自然数,但不能超过最近添加的数的一半。则6的前面可以添加1、2、3,则有16、26、36,添加26后还可继续添加最近添加的数2的一半1,即有126,同理有136。得set(6)={6,16,26,126,36,136}。

    半数集公式:

    由上公式可看出算法用递归的思想

    #include<stdio.h>
    #include<stdlib.h>
    int set(n)
    {
        int s[1000];
        int i,sum = 1;
        if(s[n] > 0)
            s[n] = sum;
        for(i=1;i<=n/2;i++)
            sum += set(i);
        s[n] = sum;
        return sum;
    }
    int main()
    {
        int n;
        printf("请输入自然数:");
        scanf("%d",&n);
        printf("半数集的元素个数为:%d
    ",set(n));
        return 0;
    }
  • 相关阅读:
    Java操作数据库——使用JDBC连接数据库
    MySQL入门——Linux下安装后的配置文件
    Linux上搭建SVN服务
    PHP包管理工具composer
    收藏博文
    Linux上软件安装
    nginx配置详解
    Linux文本编辑器Vim使用
    Linux常用命令整理
    Linux增加swap空间
  • 原文地址:https://www.cnblogs.com/ParaDise-LJ/p/6597375.html
Copyright © 2011-2022 走看看