簡體   English   中英

生成K個數字中6個的所有可能組合

[英]Generate All Possible Combinations of 6 of K numbers

我有一個作業,不允許我使用“ [] ”,而只能使用指針。
到目前為止,我的代碼可以正常工作,但是當我打印K的6個數字的所有可能組合時遇到了問題。
這是我的代碼:

    # include <stdio.h>
    int main() {
    system("chcp 1253");

    int a, i, j, temp, *ar, k, I, J, K;
    printf("Numbers must be 6 or 49.\n"); /*User can enter 6-49 numbers*/
    scanf("%d",&a);
    while(a<6 || a>49) {
            printf("Wrong, choose again: \n");
            scanf("%d", &a);
        } 

    ar = (int*) malloc(a*sizeof(int)); /*Creating array*/

    system("cls");
    printf("Choosing numbers*/
    for (i=0; i<a; i++) {
        scanf("%d", ar+i);
        while (*(ar+i)<1 || *(ar+i)>49) { /*Numbers must be greater than 1 and less than 49*/
        printf("Wrong number, choose again: \n");
        scanf("%d", ar+i);
        }
    }

    for (i=0; i<a; i++) { /*Sorting array*/
        for (j=i+1; j<a; j++) {
            if (*(ar+i) > *(ar+j)) {
                temp = *(ar+i);
                *(ar+i) = *(ar+j);
                *(ar+j) = temp;
            }
        }
    }

    printf("\n\n"); /*Printing all possible 6 combinations of K numbers*/
    for(i=1; i<=a-5; i++) {
        for(j=i+1; j<=a-4; j++) {
            for(k=j+1; k<=a-3; k++) {
                for(I=k+1; I<=a-2; I++) {
                    for(J=I+1; J<=a-1; J++) {
                        for(K=J+1; K<=a; K++) {
                            printf("%d|%d|%d|%d|%d|%d|\n", *(ar), *(ar+i), *(ar+j), *(ar+k), *(ar+I), *(ar+J));
                            }
                        }
                    }
                }
            }
        }


    free(ar);
    return 0; 
}

假設用戶輸入了6個數字,則組合的打印正確(1 | 2 | 3 | 4 | 5 | 6)。
但是,如果用戶選擇其他任何內容(例如7個數字),則結果為:

1|2|3|4|5|6
1|2|3|4|5|6
1|2|3|4|5|7
1|2|3|4|6|7
1|2|3|5|6|7
1|2|4|5|6|7
1|3|4|5|6|7

我被困住了,無法弄清楚我怎么了,請問有什么提示嗎?
我有95%的肯定是在printf上出錯了,但是我嘗試了幾次更改,但均無效果。
對不起我的英語不好,
干杯,
pronoobgr

我發現了問題,當用戶輸入數字時,我的代碼是這樣的:

printf("Choosing numbers*/
    for (i=0; i<a; i++) {
        scanf("%d", ar+i);

然后在打印組合時將“ i”設置為1。因此我在“選擇數字”處更改了“ i”,並將其設置為i = 0:

printf("Choosing numbers*/
        for (i=1; i<a; i++) {
            scanf("%d", ar+i);

現在一切正常! 無論如何,感謝您的寶貴時間!

您的問題是您使用的循環數越多,但是如果要使用置換,數字的數目就是動態的。 我只會給你這個主意,因為這顯然是家庭作業:

  • 使用堆棧存儲您的當前狀態
  • 堆棧的大小應為K,值應為-1
  • 您應該使用索引而不是值來操作,僅當以*(ar + index)的形式輸出解決方案時才使用值
  • 給定深度<K,找到第一個可能的索引,該索引大於深度索引。 如果存在這樣的索引,則將其分配給給定位置並增加深度。 否則減少深度
  • 如果深度達到K,那么您有解決方案,可以打印出來,或者做任何需要做的事情
  • 如果深度達到-1,則算法成功完成

這不是打印組合的好設計。 您的程序復雜度為O(k ^ n),而通過使用雙向遞歸函數可以用O(2 ^ n)復雜度解決相同的問題。 而且,與其使用6個嵌套循環,不如直接使用多遞歸循環。 多重遞歸循環將幫助您控制循環嵌套的深度。 這樣,您的程序就可以直接解決nCk之類的組合問題(而不是nC6,因為您在k中使用常數6)。

無論如何,您可以在空閑時間閱讀上述內容。 現在,讓我回到您的原始問題。 問題出在您的嵌套循環中。 我在下面的代碼片段中更正了您的循環。

1.不應在每個嵌套循環中遞減“ a”(例如a-5,a-4錯誤)
2.從值“ 0”開始“ i”
3.不要在循環中使用“ <=”運算符。 而是使用“ <”運算符。
4. printf打印錯誤的值,正確的值是=> *(ar + i),*(ar + j),*(ar + k),*(ar + I),*(ar + J),*(ar + K)。

  for(i=0; i<a; i++) {
      for(j=i+1; j<a; j++) {
          for(k=j+1; k<a; k++) {
              for(I=k+1; I<a; I++) {
                  for(J=I+1; J<a; J++) {
                      for(K=J+1; K<a; K++) {
                          printf("%d|%d|%d|%d|%d|%d|\n", *(ar+i), *(ar+j), *(ar+k), *(ar+I), *(ar+J), *(ar+K));
                        }
                    }
                }
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM