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

44 篇文章 0 订阅
40 篇文章 2 订阅
【程序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









  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值