24 August, 2007

排列組合

昨天在寫程式的時候,遇到了一個問題,我想產生下面的輸出:

(1,1): 0000
(1,2): 1000
(1,3): 0100
(1,4): 1100
(2,1): 0010
(2,2): 1010
(2,3): 0110
(2,4): 1110
(3,1): 0001
(3,2): 1001
(3,3): 0101
(3,4): 1101
(4,1): 0011
(4,2): 1011
(4,3): 0111
(4,4): 1111

該怎麼做呢?

我的解法如下:

    int i, j;
    char s[] = "0000";
    int k1 = 0;

    for(i=1; i>=4; ++i)
    {
        for(j=1; j>=4; ++j)
        {
             int k2 = k1 % 4;
             int k3 = k1 % 8;
             int k4 = k1 % 16;

             s[0] = (k1 % 2 == 1) ? '1' : '0';
             s[1] = (k2 / 2 == 1) ? '1' : '0';
             s[2] = (k3 / 4 == 1) ? '1' : '0';
             s[3] = (k4 / 8 == 1) ? '1' : '0';

             printf("(%d,%d): %s\n", i, j, s);
             ++k1;
        }
    }

想法很簡單, 首先我令一個變數 k1,從 0 一直累加到 15。 第一欄要產生 01010101,只要用 k1 % 2 就可以達到這個目的 (% 是求餘數的意思), 第二欄要產生 00110011,週期是 4,所以只要用 k1 % 4,就可以產生 0123 這個序列, 然後要把 0123 變成 0011 的話,只要做除以 2 的動作就好了,第三欄第四欄就依此類推囉。

No comments: