首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成K个数字中6个数字的所有可能组合

生成K个数字中6个数字的所有可能组合
EN

Stack Overflow用户
提问于 2018-01-17 02:24:43
回答 3查看 106关注 0票数 2

我有一个任务,其中不允许使用"[]",只能使用指针。

到目前为止,我的代码运行正常,但是当我打印6个K数字的所有可能的组合时,我遇到了一个问题。

下面是我的代码:

代码语言:javascript
复制
    # 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个数字,则结果为:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 2018-01-17 02:41:55

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

代码语言:javascript
复制
printf("Choosing numbers*/
    for (i=0; i<a; i++) {
        scanf("%d", ar+i);

在打印组合时,"i“设置为1。因此,我更改了"Choosing”处的"i“,并将其设置为i=0:

代码语言:javascript
复制
printf("Choosing numbers*/
        for (i=1; i<a; i++) {
            scanf("%d", ar+i);

现在一切都正常了!无论如何,感谢您的宝贵时间!

票数 0
EN

Stack Overflow用户

发布于 2018-01-17 03:05:52

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

深度使用堆栈来存储当前状态,堆栈的大小应该是K,值应该是-1\f25 *(ar + index)

  • given

  • -1\f6,而不是-1\f25-1\f25

  • -1\f6值,只有在以深度-1\f25

-1\f25

  • -1\f6(深度),而不是-1\f25 values 1\f6值。如果有这样的索引,那么将它分配到给定的位置并增加深度。否则,减小depth

  • 如果depth达到K,则您有一个解决方案,打印它,或者对其执行任何需要的操作。如果depth

  • 达到-1,则算法成功完成
票数 0
EN

Stack Overflow用户

发布于 2018-01-17 03:07:35

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

无论如何,你可以在空闲时间阅读上面提到的内容。现在,让我回到您最初的问题。问题出在您的嵌套循环中。我在下面的代码片段中更正了您的循环。

  1. 你不应该在每个嵌套循环中减少'a‘(例如a-5,a-4是错误的)
  2. 'i’从值'0‘开始,
  3. 不要在循环中使用'<=’运算符。而不是使用'<‘operator.
  4. printf打印错误的值,正确的值是=> *(ar+i),*(ar+j),*(ar+k),*(ar+I),*(ar+J),*(ar+K)。

代码语言:javascript
复制
  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));
                        }
                    }
                }
            }
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48287605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档