列印出 N 個數字的所有
排列方式

N 個數字的排列有 N! 種

例如:以 0, 1, 2, 3, ... N-1 為例

寫一個列印所有 N! 種排列的程式

用 C 程式來撰寫列印所有排列的方法有好幾種, 有一種不需要遞迴函式呼叫的方法我們稱它為 "旋轉法", 以 N = 4 來說, 這種方法是用下面的順序來列印所有的 24 種排列方式:
0 1 2 3   <-- 這組數字很容易可以得到
3 0 1 2   <-- 這組排列是由前一組排列中將四個數字一起做向右旋轉而得到的
2 3 0 1   <--                 "
1 2 3 0   <--                 "
              先把前一組數字右旋,發現數字 3 回到第 4 位,所以需要再把前三個數字右
2 0 1 3   <-- 旋,發現數字 2 不在原位置上 (第三位),完成新的一組排列
3 2 0 1   <-- 這組排列是由前一組排列中將四個數字一起做向右旋轉而得到的
1 3 2 0   <--                 "
0 1 3 2   <--                 "
              先把前一組數字右旋,發現數字 3 回到第 4 位,所以需要再把前三個數字右
1 2 0 3   <-- 旋,發現數字 2 不在原位置上 (第三位),完成新的一組排列            
3 1 2 0   <-- 這組排列是由前一組排列中將四個數字一起做向右旋轉而得到的
0 3 1 2   <--                 "
2 0 3 1   <--                 "
              先把前一組數字右旋,發現數字 3 回到第 4 位,所以需要再把前三個數字右旋,發現
1 0 2 3   <-- 數字 2 回到第三位上,需要再轉前兩個數字,檢查 1 不在第二位,完成新的一組排列
3 1 0 2   <-- 這組排列是由前一組排列中將四個數字一起做向右旋轉而得到的
2 3 1 0   <--                 "
0 2 3 1   <--                 "
              先把前一組數字右旋,發現數字 3 回到第 4 位,所以需要再把前三個數字右
2 1 0 3   <-- 旋,發現數字 2 不在原位置上 (第三位),完成新的一組排列
3 2 1 0   <-- 這組排列是由前一組排列中將四個數字一起做向右旋轉而得到的
0 3 2 1   <--                 "
1 0 3 2   <--                 "
              先把前一組數字右旋,發現數字 3 回到第 4 位,所以需要再把前三個數字右
0 2 1 3   <-- 旋,發現數字 2 不在原位置上 (第三位),完成新的一組排列
3 0 2 1   <-- 這組排列是由前一組排列中將四個數字一起做向右旋轉而得到的
1 3 0 2   <--                 "
2 1 3 0   <--                 "

0 1 2 3   <-- 先把前一組數字右旋,發現數字 3 回到第 4 位,所以需要再把前三個數字右
              旋,發現數字 2 在原位置上,需要再轉前兩個數字,檢查發現數字 1 也在原
              位置上,所以沒得再轉了,程式結束。

程式要求:

  1. 請依照上面的方法來做

  2. 請儘量用函式來簡化邏輯, 執行速度暫時不用太在意, 當然你可以討論一下不同的 N 值大概需要多少時間。

  3. 你需要用陣列變數來記錄數字

  4. 請以 ANSI C 語法及函式庫來製作

範例執行程式

程式設計課程 首頁

製作日期: 99/10/19 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@cs.ntou.edu.tw