Trang chủLập trìnhLập trình C/C++Hướng dẫn viết chương trình tính giai thừa trong C/C++

Hướng dẫn viết chương trình tính giai thừa trong C/C++

Giai thừa là tích của một dãy số tự nhiên từ 1 cho tới n, vậy làm sao để tính được giai thừa trong lập trình C/C++ cùng blog TUI CÓ CÁCH tìm hiểu trong bài viết này.

Chương trình tính giai thừa trong C/C++

Giai thừa là tích của dãy số tự nhiên liên tiếp từ 1 tới n, nhưng sẽ có 1 trường hợp đặc biệt đó là số 0, với 0! kết quả vẫn sẽ là 1.

Ta có dãy số giai thừa đầu tiên là:

0! = 1

1! = 1

2! = 2

3! = 6

4! = 24

5 != (1*2*3*4*5) = 120

….

Với bài viết này mình sẽ hướng dẫn tính giai thừa trong C/C++ theo 2 cách đó là sử dụng vòng lặp và hàm đệ quy.

Sử dụng vòng lặp

Giả sử, ta có số n cần tính giai thừa….nếu n bằng = 0 ta sẽ kết luận luân n! = 1. Ngược lại nếu n> 0, lúc này ta sẽ khai báo 1 biến factorial khởi tạo giá trị ban đầu = 1(Mọi số nhân với 0 đều = 0 nên ta sẽ gắn giá trị ban đầu là 1 để tránh kết quả cuối cùng sẽ bằng 0). Sau đó ta duyệt vòng lặp i chạy từ 1 cho tới n, mỗi bước lặp ta sẽ nhân dồn i vào factorial(mỗi bước lặp biến factorial sẽ gắn lại giá trị bằng factorial nhân với i). Sau khi thoát khỏi vòng lặp biến factorial chính là kết quả của giai thừa n.

Ta viết chương trình C tính giai thừa sử dụng vòng lặp for như sau.

#include <stdio.h>

int main()
{
	int n = 5; //Hoặc biến n bạn có thể cho nhập từ bàn phím nhé
	

//Nếu n = 0 thì ta hiển thị kq 1 và thoát khỏi chương trình
	if(n == 0){
		printf("1");
		return 0;
	}
	
//Nếu không sảy ra if chương trình sẽ chạy xuống các lệnh dưới đây đây
	int factorial = 1; //Khoi tạo biến với giá trị ban đầu là 1
	int i; 
//Duyệt vòng lặp để tính giai thừa
	for(i = 1; i<=n; i++){
		factorial = factorial*i; //Nhân dồn factorial với i
	}
	
	printf("%d! = %d", n, factorial); //Hiển thị kết quả ra màn hình
return 0;
}

Sử dụng vòng lặp while, do….while

#include <stdio.h>

int main()
{
	int n = 5;
	
	if(n == 0){
		printf("1");
		return 0;
	}
	

//Tính giai thừa sử dụng vòng lặp while
	int factorial = 1;
	int i = 1;
	while(i<=n){
		factorial = factorial*i;
		i++;
	}
	printf("Su dung vong lap while: %d! = %d", n, factorial);
	
	
//Tính giai thừa sử dụng vòng lặp do...while
	int factorial2 = 1;
	int i2 = 1;
	do{
		factorial2 = factorial2*i2;
		i2++;
	}while(i2 <= n);
	
	printf("\nSu dung vong lap do...while: %d! = %d", n, factorial2);
}

Nếu bạn vẫn chưa hiểu rõ về sự khác biệt giữa while và do…while thì đọc thêm bài viết này nhé: https://tuicocach.com/vong-lap-for-while-do-while-trong-ngon-ngu-lap-trinh-c-lap-trinh-co-ban/

Bây giờ mình sẽ viết hàm tính giai thừa thành 1 hàm riêng(chỉ với vòng lặp for thôi nhé, while, do….while làm tương tự).

#include <stdio.h>

int tinhGiaiThua(int n){
	if(n == 0) return 1;
	
	int factorial = 1;
	
	int i;
	for(i = 1; i<=n; i++){
		factorial = factorial*i;
	}
	
	return factorial;
}
int main()
{
	int n = 5;

	printf("%d! = %d", n, tinhGiaiThua(n));
}

Chuyển đổi chương trình C thành C++ như sau.

#include <iostream>

using namespace std;

int tinhGiaiThua(int n){
	if(n == 0) return 1;
	
	int factorial = 1;
	
	int i;
	for(i = 1; i<=n; i++){
		factorial = factorial*i;
	}
	
	return factorial;
}
int main()
{
	int n = 5;

	cout<<n<<"! = "<<tinhGiaiThua(n);
}

Sử dụng hàm đệ quy

Nếu với một số bạn mới làm quen với lập trình thì hàm đệ quy có lẽ sẽ tương đối là khó hiểu đấy, nếu chưa biết hay chưa thể hình dung chương trình bên dưới chạy như thế nào thì đọc thêm bài viết này về hàm đệ quy nhé: Tìm hiểu về Hàm đệ quy trong lập trình

Chương trình C tính giai thừa sử dụng hàm đệ quy

#include <stdio.h>
//Hàm tính giai thừa
int giaiThua(int n){
    if(n<=1) return 1;//Trường hợp suy biến
    return n * giaiThua(n-1); //Gọi lại hàm đệ quy để tính giai thừa n-1
}
int main()
{
    printf("Giai thua cua 4 la: %d", giaiThua(4));
}

Chương trình C++ tính giai thừa sử dụng hàm đệ quy

#include <iostream>

using namespace std;

int giaiThua(int n){
    if(n<=1) return 1;
    return n * giaiThua(n-1); 
}

int main()
{
	int n = 5;
    cout<<n<<"! = "<<giaiThua(n);
}

[Xem tất cả bài viết chủ đề C/C++ tại đây]

0 0 Phiếu bình chọn
Xếp hạng bài viết
BÀI VIẾT LIÊN QUAN
Đăng ký nhận thông báo
Thông báo email khi
guest
0 Bình luận
Không thể gửi email
Phản hồi nội tuyến

NÊN ĐỌC THÊM

Bạn muốn tìm kiếm gì?


0
Giáo sư! có thể ném gạch bên dưới nhé!x
()
x