Đề bài
Viết chương trình C++ tính giai thừa của một số nguyên dương.
Định nghĩa giai thừa: giai thừa của 1 số là tích các số liên tiếp từ 1 đến số đó. Trường hợp đặc biệt, giai thừa của 0 và 1 là 1.
Ví dụ: giai thừa của 5 là 1*2*3*4*5 = 120
Lời giải
Có 2 cách để viết chương trình tính giai thừa trong C++:
- Tính giai thừa không sử dụng đệ quy.
- Tính giai thừ có sử dụng đệ quy.
Tính giai thừa không sử dụng đệ quy
Ví dụ chương trình tính giai thừa trong C++ không sử dụng phương pháp đệ quy:
/** * Tinh giai thua KHONG dung phuong phap de quy * * @author kienthuclaptrinh.net */ #include <iostream> using namespace std; /** * tinh giai thua * * @author kienthuclaptrinh.net * @param n: so nguyen duong * @return giai thua cua so n */ long tinhGiaithua(int n) { int i; long giai_thua = 1; if (n == 0 || n == 1) { return giai_thua; } else { for (i = 2; i <= n; i++) { giai_thua *= i; } return giai_thua; } } /** * Ham main */ int main() { int a = 5; int b = 0; int c = 10; cout << "Giai thua cua " << a << "la: " << tinhGiaithua(a) << endl; cout << "Giai thua cua " << b << "la: " << tinhGiaithua(b) << endl; cout << "Giai thua cua " << c << "la: " << tinhGiaithua(c) << endl; }
Kết quả:
Giai thua cua 5 la: 120 Giai thua cua 0 la: 1 Giai thua cua 10 la: 3628800
Tính giai thừa có sử dụng đệ quy
Ví dụ chương trình tính giai thừa trong C++ có sử dụng phương pháp đệ quy:
/** * Tinh giai thua KHONG dung phuong phap de quy * * @author kienthuclaptrinh.net */ #include <iostream> using namespace std; /** * tinh giai thua * * @author kienthuclaptrinh.net * @param n: so nguyen duong * @return giai thua cua so n */ long tinhGiaithua(int n) { if (n > 0) { return n * tinhGiaithua(n - 1); } else { return 1; } } /** * Ham main */ int main() { int a = 5; int b = 0; int c = 10; cout << "Giai thua cua " << a << "la: " << tinhGiaithua(a) << endl; cout << "Giai thua cua " << b << "la: " << tinhGiaithua(b) << endl; cout << "Giai thua cua " << c << "la: " << tinhGiaithua(c) << endl; }
Kết quả:
Giai thua cua 5 la: 120 Giai thua cua 0 la: 1 Giai thua cua 10 la: 3628800