算法设计与分析: 2-5 半数集问题

这篇博客探讨了半数集问题,给出了问题描述、算法分析及两个不同的Java版本实现。通过递归公式f(n)=1+∑i=1n/2f(i)计算半数集set(n)中元素个数。示例展示了set(6)的生成过程。

2-5 半数集问题


问题描述

给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下:
(1)set(n)中包含n;
(2)在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
(3)按此规则进行处理,直至不能添加自然数为止。
例如,set(6)={6,16,26,126,36,136}。
注意:该半数集是多重集。

编程任务:对于给定的自然数n,编程计算半数集set(n)中元素的个数。


分析

set(n)set(n)中的元素个数为f(n)f(n),则显然有:
f(n)=1+n/2i=1f(i)f(n)=1+∑i=1n/2f(i)


Java: version-1

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int number;
        int count;

        while (true){
            System.out.println("Please input a number: ");

            number = input.nextInt();
            count = halfNumber(number);

            System.out.println("There are "+count+" elements!");
            System.out.println("----------------------------");
        }
    }

    private static int halfNumber(int number){
        int count = 1;
        if(number > 1){
            for(int i=1; i<=number/2; i++){
                count += halfNumber(i);
            }
        }

        return count;
    }
}

Java: version-2

import java.util.Scanner;

public class Main {
    private static int[] countArray = new int[1001];

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int number;
        int count;
        countArray[1] = 1;

        while (true){
            System.out.println("Please input a number: ");

            number = input.nextInt();
            count = halfNumber(number);

            System.out.println("There are "+count+" elements!");
            System.out.println("----------------------------");
        }
    }

    private static int halfNumber(int number){
        int count = 1;
        if(countArray[number] > 0)
            return countArray[number];

        for(int i=1; i<=number/2; i++){
            count += halfNumber(i);
        }
        countArray[number] = count;

        return count;
    }
}

Output

Please input a number: 
1
There are 1 elements!
----------------------------
Please input a number: 
2
There are 2 elements!
----------------------------
Please input a number: 
3
There are 2 elements!
----------------------------
Please input a number: 
4
There are 4 elements!
----------------------------
Please input a number: 
5
There are 4 elements!
----------------------------
Please input a number: 
6
There are 6 elements!
----------------------------
Please input a number: 
34
There are 238 elements!
----------------------------
Please input a number: 
23
There are 74 elements!
----------------------------
Please input a number: 
999
There are 1955133450 elements!
----------------------------
Please input a number: 
1000
There are 1981471878 elements!
----------------------------
Please input a number: 

Reference

王晓东《计算机算法设计与分析》(第3版)P43

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值