1. 程式人生 > >五十道程式設計小題目 --- 11 排列與組合(階乘) java

五十道程式設計小題目 --- 11 排列與組合(階乘) java

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