我有一个任务,其中不允许使用"[]",只能使用指针。
到目前为止,我的代码运行正常,但是当我打印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,但是我尝试了几次更改,都没有奏效。
很抱歉我的英语,
干杯,
pronoobgr
发布于 2018-01-17 02:41:55
我发现了我的问题,当用户输入数字时,我的代码是这样的:
printf("Choosing numbers*/
for (i=0; i<a; i++) {
scanf("%d", ar+i);在打印组合时,"i“设置为1。因此,我更改了"Choosing”处的"i“,并将其设置为i=0:
printf("Choosing numbers*/
for (i=1; i<a; i++) {
scanf("%d", ar+i);现在一切都正常了!无论如何,感谢您的宝贵时间!
发布于 2018-01-17 03:05:52
您的问题是,您使用的循环数量与您拥有的数字一样多,但是如果您打算使用排列,那么数字的数量是动态的。我只给你一个想法,因为这显然是家庭作业:
深度使用堆栈来存储当前状态,堆栈的大小应该是K,值应该是-1\f25 *(ar + index)
-1\f25
发布于 2018-01-17 03:07:35
这不是一个好的打印组合设计。您的程序复杂度是O(k^n),而同样的问题可以通过使用双向递归函数以O(2^n)复杂度来解决。此外,您可以简单地使用多递归循环,而不是使用6个嵌套循环。多重递归循环将帮助您控制循环的嵌套深度。这样,您的程序将能够直接解决像nCk这样的组合问题(而不是nC6,因为您对k使用常量值6)。
无论如何,你可以在空闲时间阅读上面提到的内容。现在,让我回到您最初的问题。问题出在您的嵌套循环中。我在下面的代码片段中更正了您的循环。
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));
}
}
}
}
}
}https://stackoverflow.com/questions/48287605
复制相似问题