五十道编程小题目 --- 11 排列与组合(阶乘) java

本文通过实例解析了排列与组合的基本概念及计算方法,并提供了具体的Java实现代码,演示了如何利用这些数学工具来解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【程序11】 

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 

思路:全排列,n个数字,能组成Anm    互不相同且无重复数字的m位数。

即:

 




扩展:

排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。
计算公式:
  
此外规定0!=1(n!表示n(n-1)(n-2)...1,也就是6!=6x5x4x3x2x1 
组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。
计算公式:
  
;C(n,m)=C(n,n-m)。(n≥m)
其他排列与组合公式 从n个元素中取出m个元素的循环排列数=A(n,m)/m!=n!/m!(n-m)!. n个元素被分成k类,每类的个数分别是n1,n2,...nk这n个元素的全排列数为 n!/(n1!×n2!×...×nk!). k类元素,每类的个数无限,从中取出m个元素的组合数为C(m+k-1,m)。

解答代码:
package wn.comeOn.java.test.arithmetic50;

import java.util.ArrayList;

public class Arrangement {

	// 阶乘
	public static int factorial(int n) {

		if (n == 0 || n == 1) {
			return 1;
		}

		for (int i = 0; i < n; i++) {
			return n * factorial(--n);
		}

		return 0;
	}

	// 排列:
	public static int arrangement01(int n, int m) {

		return factorial(n) / factorial(n - m);
	}

	// 组合:
	public static int arrangement02(int n, int m) {

		return factorial(n) / (factorial(m) * factorial(n - m));
	}

	// 有1、2、3、4个数字,全排列,三位数,都是多少?
	public static void arrange01() {

		int i = 0; // 保存百位上的数
		int j = 0; // 保存十位上的数
		int k = 0; // 保存各位上的数
		int count = 0;
		for (i = 1; i <= 4; i++) {
			for (j = 1; j <= 4; j++) {
				for (k = 1; k <= 4; k++) {
					if (i != j && j != k && i != k) {
						System.out.println(++count + ":" + (i * 100 + j * 10 + k));
					}
				}
			}
		}

	}

	// 有1、2、3、4个数字,组合,都是多少?
	public static void arrange02() {

		int i = 0; // 保存百位上的数
		int j = 0; // 保存十位上的数
		int k = 0; // 保存各位上的数
		int count = 0;
		ArrayList<Integer> arr = new ArrayList<>();

		for (i = 1; i <= 2; i++) {
			for (j = 2; j <= 3; j++) {
				for (k = 3; k <= 4; k++) {
					if (i != j && j != k && i != k) {
						int tmp = i * 100 + j * 10 + k;
						arr.add(tmp);
						System.out.println(++count + ":" + tmp);
					}
				}
			}
		}

	}

	public static void main(String[] args) {

		// System.out.println("4的阶乘为:" + factorial(4));

		System.out.println("4个数字,能组成" + arrangement01(4, 3) + "个互不相同且无重复数字的3位数");
		System.out.println("排列:" + arrangement01(4, 3));
		arrange01();

		System.out.println();
		System.out.println("组合:" + arrangement02(4, 3));
		arrange02();
	}

}

输出结果:
4个数字,能组成24个互不相同且无重复数字的3位数
排列:24
1:123
2:124
3:132
4:134
5:142
6:143
7:213
8:214
9:231
10:234
11:241
12:243
13:312
14:314
15:321
16:324
17:341
18:342
19:412
20:413
21:421
22:423
23:431
24:432

组合:4
1:123
2:124
3:134
4:234









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值