Giúp em tìm cách giải gọn và hay hơn

Đề bài: Tìm các dãy nhị phân có chiều dài n do người dùng nhập vào, với n là số nguyên dương
Ví dụ n = 3 thì có kết quả là:

000
001
010
011
100
101
110
111

Đây là bài code của em:

#include <stdio.h>
#include <math.h>
void bitFlip (int &a){
	if (a == 0) a++;
	else if (a == 1) a--;
}
void binaryFlip (int spt, int a[]){
	for (int i = spt - 1; i >= 0; i--){
		if (a[i] == 0){
			bitFlip(a[i]);
			break;
		} else if (a[i] == 1 && a[i-1] == 0){
			for (int j = spt - 1; j >= i; j--){
				bitFlip(a[j]);
			}
		}
	}
}
void xuatBinary (int spt, int a[]){
	for (int i = 0; i < spt; i++){
		printf("%d", a[i]);
	}
}
int main(){
	int n;
	printf("Nhap n: ");
	scanf("%d", &n);
	int a[n];
	for (int i = 0; i < n; i++){
		a[i] = 0;
	}
	for (int i = 1; i <= pow(2, n); i++){
		xuatBinary(n, a);
		printf("\n");
		binaryFlip(n, a);
	}
}

Kết quả ra đúng nhưng em cảm thấy nó khá rườm rà và dài dòng, cao nhân nào có cách hay hơn không ạ? Em cảm ơn.

Trang
#include <stdio.h>
 
int convert(int);
 
int main()
{
    int dec, bin;
 
    printf("Decimal number :");
    scanf("%d", &dec);
    for (int i=0;i<(2<<dec-1);i++)
    {bin = convert(i);
    printf("The binary equivalent of %d is %d.\n", i, bin);}
 
    return 0;
}
 
int convert(int dec)
{
    return dec == 0 ? 0:(dec % 2 + 10 * convert(dec / 2));
}
7 Likes

Trang ơi em giỏi quá!

quá hay :+1: nhưng đề yêu cầu phải ghi dãy đầy đủ ra, tính luôn cả những số 0 đứng đầu, bây giờ làm sao chị ơi

Dùng bitmask từ 1 << (n-1) trở xuống là lấy ra được từng chữ số một.

2 Likes
Backtracking
#include <stdio.h>

void binary(int i, char* num, int len)
{
    if (i == len) {
        num[len] = '0'; printf("%s\n", num);
        num[len] = '1'; printf("%s\n", num);
        return;
    }
    num[i] = '0'; binary(i+1, num, len);
    num[i] = '1'; binary(i+1, num, len);
}

int main()
{
    int n = 3;
    char num[33];
    num[n] = '\0';
    binary(0, num, n-1);
}
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?