đếm in xâu nhị phân (dùng thuật toán sinh )
Đề bài:
Một xâu nhị phân độ dài n được gọi là thuận nghịch hay đối xứng nếu đảo ngược xâu nhị phân đó ta vẫn nhận được chính nó. Cho số tự nhiên n (n nhập từ bàn phím). Hãy viết chương trình liệt kê tất cả các xâu nhị phân thuận nghịch có độ dài n. Các xâu nhị phân tìm được ghi lại trong file ketqua.out theo khuôn dạng:
Một xâu nhị phân độ dài n được gọi là thuận nghịch hay đối xứng nếu đảo ngược xâu nhị phân đó ta vẫn nhận được chính nó. Cho số tự nhiên n (n nhập từ bàn phím). Hãy viết chương trình liệt kê tất cả các xâu nhị phân thuận nghịch có độ dài n. Các xâu nhị phân tìm được ghi lại trong file ketqua.out theo khuôn dạng:
·
Dòng đầu tiên ghi
lại số K là số các xâu thuận nghịch có độ dài n tìm được;
·
K dòng kế tiếp
ghi lại mỗi dòng một xâu nhị phân thuận nghịch có độ dài n. Hai phần tử khác
nhau của xâu thuận nghịch được ghi cách nhau một vài khoảng trống.
Ví
dụ với n = 4 ta tìm được 4 xâu nhị phân thuận nghịch như dưới đây.
ketqua.out
4
0 0 0 0
0 1 1 0
1 0 0 1
1 1 1 1
giải:
#include<iostream> #include<iomanip> using namespace std; void xuat( int a[], int n){ for(int i = 0; i < n; i++) cout << setw(5) << a[i]; cout << endl; } void sinh( int a[], int n, int &ok){ int i = n-1; while( i >= 0 && a[i] == 1){ a[i] = 0; i--; } if( i >= 0){ a[i] = 1; } else ok = 0; } int ktmang(int a[100], int n) { int i = 0; int j = n - 1; while( i < n/2) { if(a[i] != a[j]) return 0; i++; j--; } return 1; } void sinhlientuc(int a[], int n, int ok, int kq[1000][100], int &demKq){ while(ok){ if(ktmang(a, n)){ for(int i = 0; i < n; i++) kq[demKq][i] = a[i]; demKq++; } sinh(a,n,ok); } } void inKetqua(int kq[1000][100], int demKq, int n){ cout << demKq<<endl; for(int i = 0; i < demKq; i++){ for(int j = 0; j < n; j++) cout << setw(2) << kq[i][j]; cout << endl; } } int main(){ int n; int ok=1; int a[100] = {}; int kq[1000][100]; int demKq = 0; cin >> n; sinhlientuc(a, n, ok, kq, demKq); inKetqua(kq, demKq, n); }
anh ơi cho em xem lưu đồ thuật toán với em không hiểu anh viết gì cả
Trả lờiXóa