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

C語言排列組合:從 1,2,3,4 選 3 個數字組成無重複三位數,列舉與計數

     編輯:關於C

問題定義

從數字集合 {1,2,3,4} 中選取 3 個互不相同的數字,組成三位數。求總數與列舉所有數字。

數學答案:P(4,3) = 4×3×2 = 24 個。

三重迴圈暴力列舉

#include <stdio.h>

int main()
{
    int count = 0;
    for (int i = 1; i <= 4; i++)      // 百位
        for (int j = 1; j <= 4; j++)  // 十位
            if (i != j)
                for (int k = 1; k <= 4; k++)  // 個位
                    if (k != i && k != j) {
                        printf("%d%d%d\n", i, j, k);
                        count++;
                    }
    printf("共 %d 個\n", count);
    return 0;
}

執行結果


123 124 132 134 142 143
213 214 231 234 241 243
312 314 321 324 341 342
412 413 421 423 431 432
共 24 個

進階:通用排列產生器

若元素個數 n、選取 r 為變數,三重迴圈不再適用,需用遞迴回溯或下一個排列算法:


// 回溯法框架
void permute(int* a, int n, int r, int depth, int* used, int* cur) {
    if (depth == r) { print(cur); return; }
    for (int i = 0; i < n; i++)
        if (!used[i]) {
            used[i] = 1; cur[depth] = a[i];
            permute(a, n, r, depth+1, used, cur);
            used[i] = 0;
        }
}

C++ STL 一鍵解法


#include <algorithm>
#include <iostream>
int main() {
    int a[] = {1,2,3,4};
    do { for(int x:a) std::cout<<x; std::cout<<'\n'; }
    while(std::next_permutation(a, a+4));
}

教學重點

  • 三重迴圈 + 不等判斷 = 排列列舉的最直觀實作
  • 條件 k!=i && k!=j 確保三數互異
  • 計數器 count 驗證 P(n,r) 公式
  • 理解「順序不同視為不同」是排列核心
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved