代码之家  ›  专栏  ›  技术社区  ›  aaronasterling

用C语言构造数组补码的惯用方法

  •  1
  • aaronasterling  · 技术社区  · 14 年前

    0 <= x <= 52

    # just included for specificity
    cards = [card for card in deck if card not in hand]
    

    在C语言中,我能做的就是

    int i, j, k, found_flag;
    int cards[48];    /* int hand[4] is passed in */
    
    k = 0;
    for (i = 0; i < 52; i++) {
      found_flag = 0;
      for (j = 0; j < 4; j++) {
        if (i == hand[j]) {
          found_flag = 1;
          break;
        }
      }
      if (!found_flag) {
          cards[k++] = i;
      }
    }
    

    这对这种情况最合适吗?一般来说,是“去”的模式吗?

    4 回复  |  直到 14 年前
        1
  •  1
  •   caf    14 年前

    当然,你的例子对于一只只有4号的手来说是很好的-这已经足够清楚了。在数组大得多的情况下,可以使用基于各种排序的更有效的算法。

    int i, j;
    int card_in_hand[52] = { 0 };
    int cards[48];    /* int hand[4] is passed in */
    
    for (i = 0; i < 4; i++)
        card_in_hand[hand[i]] = 1;
    
    j = 0;
    for (i = 0; i < 52; i++)
      if (!card_in_hand[i])
          cards[j++] = i;
    
        2
  •  1
  •   Gangadhar    14 年前

    cards_in_deck[48]={1};
    for (int i=0;i<4;i++)
        cards_in_deck[hand[i]]=0;
    

    牌堆中的牌是一个数组,对于那些不在牌堆中的牌,值为1。这就是你要找的吗?

        3
  •  0
  •   Jackson    14 年前

    这是我用来解决这个问题的小测试程序。它创建一个集合来显示选择了哪些卡,并扫描集合来构建剩余卡的数组。

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char **argv)
    {
        int cardsSelected[4] = {3,7,10,49} ;
        int cardsLeft[48] ;
        int allCards[52] ;
    
        memset(allCards,0,sizeof(int)*52) ;
        for(int i= 0; i < 4; ++i) {
            allCards[cardsSelected[i]] = 1 ;
        }
    
        int k = 0 ;
        for(int i =0; i < 52; ++i) {
            if (!allCards[i])
                cardsLeft[k++] = i ;
        }
    
        for(int i = 0; i < 48; ++i) {
            printf("%d ", cardsLeft[i]) ;
        }
        printf("\n") ;
    
        return 0;
    }
    
        4
  •  0
  •   hughdbrown    13 年前

    在C语言中,遍历已排序的手牌:

    int cards_in_deck[48];
    const int ranges[6][2] = {
        {0,           hand[0]}, 
        {hand[0] + 1, hand[1]},
        {hand[1] + 1, hand[2]},
        {hand[2] + 1, hand[3]},
        {hand[3] + 1, hand[4]},
        {hand[4] + 1, 52}
    };
    int j = 0;
    for (int i = 0; i < sizeof(ranges)/sizeof(ranges[0]); i++) {
        const int *range = ranges[i];
        for (int k = range[0]; k < range[1]; k++)
            cards_in_deck[j++] = k;
    }
    

    hand = [0, 10, 11, 40, 51]
    ranges = [
        [0,           hand[0]], 
        [hand[0] + 1, hand[1]],
        [hand[1] + 1, hand[2]],
        [hand[2] + 1, hand[3]],
        [hand[3] + 1, hand[4]],
        [hand[4] + 1, 52]
    ]
    cards_in_deck = [k for r in ranges for k in range(r[0], r[1])]