首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言排列組合實作:從 n 個數字生成所有不重複三位數並計數

     編輯:關於C語言

C 語言排列組合實作:從 n 個數字生成所有不重複三位數並計數

問題

給定 n 個不同數字 (1~n),組成多少個互不相同的三位數?並列印它們。

暴力枚舉三層迴圈

#include <stdio.h>

int main() {
    int n;
    printf("輸入 n (1-9): ");
    scanf("%d", &n);
    if (n < 3) { puts("無法組成三位數"); return 0; }

    int count = 0;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            for (int k = 1; k <= n; ++k)
                if (i != j && i != k && j != k) {
                    int num = i*100 + j*10 + k;
                    printf("%d ", num);
                    ++count;
                }
    printf("\n總數: %d\n", count);
    return 0;
}

數學公式驗證

排列數 P(n,3) = n * (n-1) * (n-2)。
例:n=4 → 4*3*2=24 個。

效能優化:遞迴/回溯生成排列

void permute(int *pool, int n, int *cur, int depth, int *cnt) {
    if (depth == 3) {
        int num = cur[0]*100 + cur[1]*10 + cur[2];
        printf("%d ", num); (*cnt)++; return;
    }
    for (int i = 0; i < n; ++i) {
        int used = 0;
        for (int d = 0; d < depth; ++d) if (cur[d] == pool[i]) { used = 1; break; }
        if (!used) { cur[depth] = pool[i]; permute(pool, n, cur, depth+1, cnt); }
    }
}

教學重點

  • 三層迴圈直觀但 O(n³),n=9 時 729 次迭代可接受。
  • 條件 i!=j && i!=k && j!=k 過濾重複。
  • 回溯法擴展性更好,可處理任意長度排列。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved