31. 葛雷碼 反射二進位編碼-葛雷碼 (Gray code),是編碼成兩個連續的位元不同。 輸入 n ,編碼範圍 0<=i<=2^n-1。 n = 3,編碼 0~7 為 000, 001, 011, 010, 110, 111, 101, 100。 其編碼方式如下 G_1 = {0, 1} G_1_r = {1, 0} G_n = {0G_(n-1), 1G_(n-1)_r } if G_n = {g1, g2, g3, ..., gn} G_n_r = {g_n, g_(n-1), g_(n-2), ..., g_1} [G_n_r 是 G_n 的逆向順序] G_(n+1) = {0G_n, 1G_n_r} 例如 G_2 = {0G_1, 1G_1_r} = {00, 01, 11, 10} G_2_r = {10, 11, 01, 00} G_3 = {0G_2, 1G_2_r} = {000, 001, 011, 010, 110, 111, 101, 100} G_3_r = {100, 101, 111, 110, 010, 011, 001, 000} G_4 = {0000, 0001, 0011, 0010, 0110, 0111, 0101, 0100, 1100, 1101, 1111, 1110, 1010, 1011, 1001, 1000} G_4_r = {1000, 1001, 1011, 1010, 1110, 1111, 1101, 1100, 0100, 0101, 0111, 0110, 0010, 0011, 0001, 0000} 其遞迴公式為 G(n, k) = k if n=1 G(n, k) = 0G(n-1, k) if k<2^(n-1) G(n, k) = 1G(n-1, 2^n-1-k) if k>=2^(n-1) 當 G(4, 7) = 0G(4-1, 7) = 0G(3, 7) = 01G(3-1, 2^3-1-7) = 01G(2, 0) = 010G(2-1, 0) = 010G(1, 0) = 0100 依此撰寫遞迴程式,輸入 n, k,輸出 Gray code。 【輸入說明】 第一行是輸入資料,整數n(1<=n<=8)、整數k(1<=k<=8) 接下來重複第一行,直到輸入 -1 結束 範例輸入說明: Sample Input: 1 1 (第一筆資料,n=1、k=1) 2 3 (第二筆資料,n=2、k=3) 3 6 (第三筆資料,n=3、k=6) 4 12 (第四筆資料,n=4、k=12) -1 (結束讀取) 【輸出說明】 每一行輸出一個測試資料的結果 範例輸入說明: 1 (n=1、k=1的執行結果) 10 (n=2、k=3的執行結果) 101 (n=3、k=6的執行結果) 1010 (n=4、k=12的執行結果) 【測試資料一】 輸入: 3 7 4 15 5 30 1 0 6 50 -1 輸出: 100 1000 10001 0 101011 【測試資料二】 輸入: 3 4 3 5 3 6 4 10 4 11 4 12 5 16 -1 輸出: 110 111 101 1111 1110 1010 11000 【測試資料三】 輸入: 5 1 6 16 7 4 4 4 -1 輸出: 00001 011000 0000110 0110 【隱藏測試資料一】 輸入: 2 2 3 5 4 13 5 22 -1 輸出: 11 111 1011 11101 【隱藏測試資料二】 輸入: 5 16 5 17 5 18 5 19 5 20 -1 輸出: 11000 11001 11011 11010 11110 【隱藏測試資料三】 輸入: 6 0 6 2 6 4 6 8 9 15 -1 輸出: 000000 000011 000110 001100 000001000