【Java算法】由数字1,2,3,4,5组成,没有重复数字的五位数,其中小于50000的偶数共有几个? 并请列出这些数字

【数学解法】

该题分三步:

1.个位:2,4选一,C21;

2.万位:1,2,3,4皆可,但要去掉放在个位的一个,C31;

3.千百十位:三个全排,A33;

Sum=C21*C31*A33=2*3*3*2*1=6*6=36种

【代码解法】

思路:将12345全排列,过滤掉首数为五的和尾数不是偶数的。

SixtySix类:

package test230425;

import java.util.List;

import arrange.Arranger;

/**
 * 由数字1,2,3,4,5组成,没有重复数字的五位数,其中小于50000的偶数共有几个?
 * 并请列出这些数字
 *
 */
public class SixtySix {
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5 };
    
        Arranger arranger = new Arranger(arr);
        
        int idx = 0;
        for (List<Integer> res : arranger.getResults()) {
            int first=res.get(0);
            int last=res.get(4);
            
            if(first<5 && (last % 2==0)) {
                String num=""+res.get(0)+res.get(1)+res.get(2)+res.get(3)+res.get(4);
                System.out.println(String.format("%02d",++idx)+"."+num);
            }
        }
    }
}

Arranger类:

package arrange;

import java.util.ArrayList;
import java.util.List;

/**
 * 用于产生数组全排列结果的工具类
 * @since 2023/4/21
 */
public class Arranger {
    // 保存在内部的原始元素数组的引用
    private int[] rawArr;

    // 返回结果
    private List<List<Integer>> results;

    /**
     * 构造函数
     * 
     * @param raws 原始元素数组
     */
    public Arranger(int[] raws) {
        rawArr = raws;
        results = new ArrayList<>();

        doArrange(new ArrayList<>());
    }

    /**
     * 使用递归进行全排列,结果放在results中
     * 
     * @param initialList 初始链表
     */
    private void doArrange(List<Integer> initialList) {
        List<Integer> innerList = new ArrayList<>(initialList);

        if (rawArr.length == initialList.size()) {
            results.add(innerList);
        }

        for (int i = 0; i < rawArr.length; i++) {
            if (innerList.contains(rawArr[i])) {
                continue;
            }

            innerList.add(rawArr[i]);
            doArrange(innerList);
            innerList.remove(innerList.size() - 1);
        }
    }

    /**
     * 获得结果链表的引用
     * 
     * @return
     */
    public List<List<Integer>> getResults() {
        return results;
    }

    // 测试
    public static void main(String[] args) {
        int[] numbers = { 1, 2, 3,4,5};
        Arranger arranger = new Arranger(numbers);

        int idx = 0;
        for (List<Integer> re : arranger.getResults()) {
            System.out.println(String.format("%02d", ++idx) + "." + re);
        }
    }
}

【输出】

01.12354
02.12534
03.13254
04.13452
05.13524
06.13542
07.14352
08.14532
09.15234
10.15324
11.15342
12.15432
13.21354
14.21534
15.23154
16.23514
17.25134
18.25314
19.31254
20.31452
21.31524
22.31542
23.32154
24.32514
25.34152
26.34512
27.35124
28.35142
29.35214
30.35412
31.41352
32.41532
33.43152
34.43512
35.45132
36.45312

程序和数学分析可以相互印证。

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值