【问题标题】:Generate All Possible Combinations of 6 of K numbers生成 6 个 K 数的所有可能组合
【发布时间】:2018-01-16 18:24:43
【问题描述】:

我有一个作业不允许我使用“[]”,只能使用指针来完成。
到目前为止,我的代码运行良好,但是在打印 6 个 K 数字的所有可能组合时遇到了问题。
这是我的代码:

    # 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 上,但我尝试了几次更改,但都没有成功。
对不起我的英语,
干杯,
代言人

【问题讨论】:

  • 经验法则:如果您有超过 3 个嵌套循环,那么您可能会做出更好的设计。
  • 你没有在最里面的循环中使用K
  • @WeatherVane 如果我添加 *(ar+K) (当然更改所有 *(ar+i,j,k..),它不会显示第一个数字,那个用户输入。

标签: c numbers


【解决方案1】:

我发现了我的问题,当用户输入数字时,我的代码是这样的:

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);

现在一切正常!无论如何,谢谢你的时间!

【讨论】:

  • 我明白,但是你应该重写代码,6个周期不是一个好主意。想象一下您不需要预先组合的元素数量的情况。在您的情况下,该值恒定为六,但如果它是用户输入,那么您将不知道需要多少个周期。查看我的解决方案,我相信它会对您有所帮助。
【解决方案2】:

您的问题是,您使用的循环数量与拥有的数字一样多,但如果您打算使用排列,则数字的数量是动态的。我只会给你一个想法,因为这显然是家庭作业:

  • 使用堆栈来存储您的当前状态
  • 堆栈的大小应为 K,值应为 -1
  • 你应该用索引而不是值来操作,只有当你以*(ar + index)的形式输出解时才使用值
  • 给定深度
  • 如果深度达到 K,那么您就有了解决方案,将其打印出来,或者做任何您需要做的事情
  • 如果深度达到-1,则算法成功完成

【讨论】:

    【解决方案3】:

    这不是打印组合的好设计。您的程序复杂度为 O(k^n),而同样的问题可以通过使用双向递归函数以 O(2^n) 复杂度来解决。此外,您可以简单地使用多递归循环,而不是使用 6 个嵌套循环。多递归循环将帮助您控制循环嵌套的深度。这样,您的程序将能够直接解决诸如 nCk 之类的组合问题(而不是 nC6,其中您使用常数值 6 表示 k)。

    无论如何,您可以在空闲时间阅读上述内容。现在,让我回到你原来的问题。问题出在您的嵌套循环中。我在下面的代码 sn-p 中更正了你的循环。

    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));
                            }
                        }
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 2016-08-16
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多