Trong bài toán liệt kê tất cả tập con của tập n phần tử {1, 2, 3, … n}, chương trình của em gồm những phần như sau.
- Xây dựng hàm
void tapCon(int n, int k)
trong đó n là số phần tử tập mẹ, k là số phần tử tập con. - Ở
main()
, nhập n từ bàn phím. Khai báo k và dùng vòng lặpfor(k = 0; k <= n; k++)
để in ra tập con có 0, 1, 2, … n phần tử.
(Em để code bên dưới nếu mọi người cần ạ!)
Nhưng khi chạy thì kết quả chỉ hiện với trường hợp giá trị khởi tạo của k trong vòng for, chứ không phải từ 0 đến n.
Mọi người có thể giải thích cho em được không ạ?
void TapCon(int n, int k)
{
int *a = NULL, i = 0;
// Tạo mảng a chứa các số từ 1 đến k
a = malloc(k * sizeof(int));
if (a == NULL) exit(0);
for (i = 0; i < k; i ++)
a[i] = i + 1;
// Thực hiện việc tìm trường hợp thỏa mãn bằng phương pháp sinh.
while(i >= 0)
{
for (i = 0; i < k; i ++)
printf("%d ", a[i]);
printf("\n");
i = k - 1;
while (a[i] >= n - (k - 1) + i && i >= 0)
i --;
if (i < 0) exit(0);
a[i] ++;
for (int j = 1; j < k - i; j ++)
a[i + j] = a[i] + j;
}
free(a);
}
int main(int argc, char* argv[])
{
int n = 0, k = 0;
scanf("%d", &n);
for (k = 0; k <= n; k ++)
TapCon(n, k);
return 0;
}