Bài toán: Nhập vào một số nguyên dương n. Hãy vẽ ra tam giác pascal với chiều cao n.
- Input
3
- Output
1 1 1 1 2 1
Ý tưởng vẽ tam giác pascal
Từ hình ảnh trên ta thấy như sau:
- Hàng thứ nhất chỉ có duy nhất một số 1. Đây chính là tổ hợp
- Hàng thứ hai có hai số 1. Đây chính là hai tổ hợp
- Hàng thứ ba sẽ là các số
- Vậy từ đây ta suy ra mỗi hàng là tất cả các tổ hợp của i ( với i chạy từ 0 đến n-1 ).
Nếu các bạn chưa biết tính tổ hợp thì có thể xem tại đây.
Với ý tưởng trên ta sẽ dùng hai vòng for lồng nhau để vẽ ra tam giác pascal.
- Vòng for thứ nhất đại diện cho số dòng là i chạy từ 0 đến
n-1
- Vòng for thứ hai đại diên cho tổ hợp chập j của i phần tử ( với j chạy từ 0 đến i )
Code tham khảo cách vẽ tam giác pascal
Cùng xem chương trình dưới đây
#include<iostream> using namespace std; int C(int k, int n) { if (k == 0 || k == n) return 1; if (k == 1) return n; return C(k - 1, n - 1) + C(k, n - 1); } int main(){ int n; cin >> n; cout << "---------PASCAl---------" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { cout << C(j, i) << " "; } cout << endl; } system("pause"); return 0; }
Sau khi chạy chương trình trên ta có kết quả
3 ---------PASCAl--------- 1 1 1 1 2 1
Vậy là đã đúng với yêu cầu bài toán, nhưng các bạn có thấy nó khác với hình ảnh ở trên không ? Vậy thì chúng ta cùng cải thiện chương trình trên để nó vẽ ra một tam giác pascal đẹp hơn nhé !
1 1 1 1 2 1
Bạn có thấy hàng cuối cùng luôn sát với lề không ? Hàng trên thì lại bị thụt vào một khoảng trống so với hàng dưới.
Nếu hàng thứ n (hàng cuối cùng) có 0 khoảng trắng, thì hàng thứ n-1 sẽ có 1 khoảng trắng, tương tự cho các hàng khác. Vậy hàng đầu tiên sẽ có (n-1) khảng trắng phải không nào ?
Với ý tưởng trên ta có thể viết lại chương trình như sau
#include<iostream> using namespace std; int C(int k, int n) { if (k == 0 || k == n) return 1; if (k == 1) return n; return C(k - 1, n - 1) + C(k, n - 1); } int main(){ int n; cin >> n; cout << "---------PASCAl---------" << endl; for (int i = 0; i < n; i++) { for (int j = n; j > i; j--) cout << " "; for (int j = 0; j <= i; j++) { cout << C(j, i) << " "; } cout << endl; } system("pause"); return 0; }
Sau khi chạy chương trình xong thì ta có kết quả sau
5 ---------PASCAl--------- 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
Bài viết của mình đến đây là kết thúc. Cám ơn các bạn đã theo dõi !
Để lại một bình luận