30/09/2018, 16:20

Thắc mắc về cách hoạt động của vòng lặp for trong bài toán liệt kê dãy nhị phân

Em gặp một chút vướng mắc với vòng lặp for khi thực hiện bài toán liệt kê dãy nhị phân. Sau một hồi loay hoay, em đã hoàn thành được bài toán tuy nhiên không hiểu tại sao vòng lặp for thực hiện lại từ đầu (quay đầu) khi gặp câu điều kiện if. Mong các anh chị cḥ̣ỉ dẫn giúp em. Dưới đây là code em đã thực hiện thành công:

#include <stdio.h>
int main()
{
	int i,n,a[30];
	printf("Nhap vao do dai day nhi phan: ");
	scanf("%d",&n);
	for(i=1;i<=n;i++)	{
		a[i]=0;
		printf("%d",a[i]);
	}
	printf("
");
	for(i=n;i>0;i--)	{
		if(a[i]==0)		{
			a[i]+=1;						
			for(i=i+1;i<=n;i++)			
				a[i]=0;
			for(i=1;i<=n;i++)				
				printf("%d",a[i]);
			printf("
");
		}
	}
        return 0;
}
... viết 18:35 ngày 30/09/2018
  00111111
+        1
= 01000000
+        1
= 01000001
+        1
= 01000010

Nguyên tắc của số nhị phân là khi cộng thêm 1 đơn vị, lặp từ cuối về đầu để tìm số 0. Bắt gặp được số 0 thì thay vị trí đó thành số 1, những số 1 đứng sau số 0 đó sẽ thay thành số 0 hết.

        //Lặp từ cuối về đầu
	for(i=n;i&gt;0;i--)	{
                //Nếu gặp số 0
		if(a[i]==0)		{ 
			a[i]+=1; //Thay thành số 1						
			for(i=i+1;i&lt;=n;i++) // Lặp từ vị trí số 0 được tìm thấy			
				a[i]=0; //Thay những số đó thành số 0 hết
			for(i=1;i&lt;=n;i++)	//In ra			
				printf("%d",a[i]);
			printf("\n");
		}
	}
        return 0;
}
Thanh Bình Nguyễn viết 18:33 ngày 30/09/2018

Cảm ơn anh ạ. Về mặt nguyên lý thì em hiểu hoàn toàn nhưng em thấy code em vừa viết đúng ra chỉ in ra
0001 0010 0100 1000
Nhưng hình như do em dùng dev nên nó mới in ra dãy nhị phân như yêu cầu?

Bài liên quan
0