Lập trình C - Tính giai thừa

Tính giai thừa trong C

Đị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

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
 *  
 
 */
 
#include<stdio.h>
 
/**
 * tinh giai thua
 * 
 * @author viettuts.vn
 * @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;
    printf("Giai thua cua %d  la: %d \n",  a, tinhGiaithua(a));
    printf("Giai thua cua %d  la: %d \n",  b, tinhGiaithua(b));
    printf("Giai thua cua %d  la: %d",  c, tinhGiaithua(c));
}

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 su dung phuong phap de quy
 *  
 
 */

#include<stdio.h>

/**
 * tinh giai thua
 * 
 * @author viettuts.vn
 * @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;
    printf("Giai thua cua %d  la: %d \n",  a, tinhGiaithua(a));
    printf("Giai thua cua %d  la: %d \n",  b, tinhGiaithua(b));
    printf("Giai thua cua %d  la: %d",  c, tinhGiaithua(c));
}

Kết quả:

Giai thua cua 5  la: 120
Giai thua cua 0  la: 1
Giai thua cua 10  la: 3628800