[英]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);
現在一切正常! 無論如何,感謝您的寶貴時間!
您的問題是您使用的循環數越多,但是如果要使用置換,數字的數目就是動態的。 我只會給你這個主意,因為這顯然是家庭作業:
*(ar + index)
的形式輸出解決方案時才使用值 這不是打印組合的好設計。 您的程序復雜度為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.