C 程序不打印输出终端



这是一个将给定数组的所有可能组合存储在数组ans[][]中的程序。

#include <stdio.h>
int ingredients = 10;
int ans[10][10];
int x = 0;
void makeCombination(int arr1[], int data[], int st, int end, int index, int r);
void CombinationDisplay(int arr1[], int n, int r) {
int data[r];
makeCombination(arr1, data, 0, n - 1, 0, r);
}
void makeCombination(int arr1[], int data[], int st, int end, int index, int r) {
if (index == r) {
for (int j = 0; j < r; j++)
ans[x][j] = data[j];
x++;
return;
}
for (int i = st; i <= end && end - i + 1 >= r - index; i++) {
data[index] = arr1[i];
makeCombination(arr1, data, i + 1, end, index + 1, r);
}
}
int main() {
int arr1[ingredients], i;
for (i = 0; i < ingredients; i++)
arr1[i] = i;
int n = sizeof(arr1) / sizeof(arr1[0]);
for (int r = 0; r < ingredients; r++)
CombinationDisplay(arr1, n, r);

for (i = 0; i < ingredients; i++) {
for (int j = 0; j < i; j++) {
printf("%d", ans[i][j]);
}
printf("n");
}
return 0;
}

它应该将所有的组合存储在一个数组ans中并打印出来。但是,它不会显示任何错误,也不会在终端中输出。

您的代码中存在多个问题:

  • int ans[10][10];对于10个元素的所有组合都不够大:有2个10可能的组合(10个元素集合的子集(
  • 打印子集的初始子集将产生许多重复
  • 递归方法并不像迭代方法那样简单

这是一个修改后的版本:

#include <stdio.h>
#define INGREDIENTS 10  // must be in the range 1 to 30 for 32-bit int
int main() {
for (int i = 0; i < (1 << INGREDIENTS); i++) {
for (int j = 0; j < INGREDIENTS; j++) {
if (i & (1 << j))
printf("%u ", j);
}
printf("n");
}
return 0;
}

最新更新