การหาค่าหาแฟกทอเรียล ในภาษา C และภาษา C++

ในบทความนี้ คุณจะได้เรียนรู้เกี่ยวกับการเขียนโปรแกรมเพื่อคำนวณหาค่าแฟกทอเรียลในภาษา C และ C++ และทำความรู้จักกับว่าแฟกทอเรียลคืออะไร นี่เป็นเนื้อหาในบทนี้

  • แฟกทอเรียลคืออะไร
  • โปรแกรมหาค่าแฟกทอเรียล
  • การหาค่าแฟกทอเรียลด้วย Recursive function
  • ข้อจำกัดของโปรแกรม

แฟกทอเรียลคืออะไร

แฟกทอเรียล (Factorial) ของจำนวนเต็มบวก n ที่แสดงด้วย n! นั้นคือผลลัพธ์จากการคูณกันของตัวเลขตั้งแต่ 1 ถึง n ยกเว้น 0! ที่ตามคำนิยามนั้นมีค่าเท่ากับ 1; แฟกทอเรียลนั้นถูกใช้ในทางคณิตศาสตร์ที่สามารถพบได้ในคอมพิวเตอร์ เช่น ในเรื่องของความน่าจะเป็น ดังนั้นมันจึงเป็นเรื่องปกติถ้าหากเราต้องการที่จะเขียนโปรแกรมเพื่อหาค่าแฟกทอเรียลบนคอมพิวเตอร์

สำหรับการหาค่าแฟกทอเรียลของจำนวนเต็ม n ใดๆ นั้นสามารถแสดงได้ดังสมการต่อไปนี้

n! = n × (n - 1) × (n - 2) × (n - 3) × ... × 3 × 2 × 1

ยกตัวอย่างเช่น

5! = 5 × 4 × 3 × 2 × 1

ในการหาค่าแฟกทอเรียลของ 5 นั้นเป็นการนำตัวเลขจาก 1 ถึง 5 มาคูณกันซึ่งจะมีค่าเท่ากับ 120 เหมือนกับที่แสดงในตัวอย่าง ดังนั้น 5! จึงมีค่าเท่ากับ 120

โปรแกรมหาค่าแฟกทอเรียล

เนื่องจากภาษา C และภาษา C++ นั้นเป็นภาษาที่มีโครงสร้างของภาษาที่ใกล้เคียงกัน นั่นทำให้โค้ดสำหรับการเขียนโปรแกรมเพื่อหาค่าแฟกทอเรียลในภาษาทั้งสองไม่แตกต่างกันมาก ดังนั้นในบทนี้จะแสดงโค้ดของทั้งสองภาษาและอธิบายการทำงานไปพร้อมๆ กัน นี่เป็นตัวอย่างของโปรแกรมสำหรับหาค่าแฟกทอเรียลทั้งในภาษา C และภาษา C++

factorial.c
#include <stdio.h>

int main() {
    int n, i;
    printf("Enter a number: ");
    scanf("%d", &n);

    int sum = 1;
    for (i = 1; i <= n; i++) {
        sum *= i;
    }

    printf("%d! = %d", n, sum);
    return 0;
}
factorial.cpp
#include <iostream>

using namespace std;

int main() {
    int n, i;
    cout << "Enter a number: ";
    cin >> n;

    int sum = 1;
    for (i = 1; i <= n; i++) {
        sum *= i;
    }

    cout << n << "! = " << sum << endl;
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม เมื่อกรอกค่านำเข้าเป็น 5 และ 0 ตามลำดับ

Enter a number: 5
5! = 120
Enter a number: 0
0! = 1

ในตัวอย่าง เป็นโปรแกรมสำหรับหาค่าแฟกทอเรียลในภาษา C และภาษา C++ คุณสามารถคลิกในแต่ละแท็บเพื่อดูโค้ดของแต่ละภาษาได้ การทำงานของโปรแกรมนั้นเรียบง่ายโดยเริ่มการรับตัวเลขจากคีย์บอร์ดแล้วนำมาคำนวณหาค่าแฟกทอเรียล และแสดงผลออกทางหน้าจอ

int n, i;
printf("Enter a number: ");
scanf("%d", &n);

ในตอนแรกเป็นการประกาศตัวแปรที่จะใช้ในโปรแกรม จากนั้นเป็นการรับค่าจากทางคีย์บอร์ดเข้ามาเก็บไว้ในตัวแปร n ซึ่งเป็นจำนวนเต็มบวกที่เราจะนำมาคำนวณหาค่าแฟกทอเรียล

int sum = 1;
for (i = 1; i <= n; i++) {
    sum *= i;
}

ในขั้นตอนการคำนวณค่าแฟกทอเรียล เนื่องจากแฟกทอเรียลของ n นั้นเป็นผลคูณกันของตัวเลขจาก 1 ถึง n ดังนั้นเราใช้คำสั่ง for loop เพื่อวนเป็นจำนวน n รอบ และนำตัวเลขมาคูณกันเก็บไว้ในตัวแปร sum และเมื่อ loop ทำงานเสร็จสิ้น เราจะได้ค่าแฟกทอเรียลในตัวแปร sum จากนั้นแสดงผลออกทางหน้าจอ

จากคำนิยาม 0! มีค่าเท่ากับ 1 เสมอ ดังนั้นเมื่อค่าที่กรอกเข้ามาเป็น 0 คำสั่ง for loop จะไม่ทำงานเนื่องจากเงื่อนไข i <= n เป็นเท็จตั้งแต่แรก นั่นทำให้ค่าในตัวแปร sum เป็น 1 เช่นเดิมซึ่งเป็นผลลัพธ์ที่เราต้องการ

Recursive function

ในตัวอย่างก่อนหน้า เป็นการเขียนโปรแกรมเพื่อหาค่าแฟกทอเรียลโดยการใช้คำสั่ง for loop อย่างไรก็ตาม ในการเขียนโปรแกรมเพื่อแก้ปัญหาใดปัญหาหนึ่งนั้นสามารถทำได้หลายวิธี ในตัวอย่างนี้ เราจะเขียนโปรแกรมสำหรับหาค่าแฟกทอเรียลโดยการใช้ฟังก์ชัน Recursive

นี่เป็นตัวอย่างของโปรแกรมสำหรับหาค่าแฟกทอเรียลที่เขียนด้วยฟังก์ชัน Recursive ในภาษา C และ C++

factorial2.c
#include <stdio.h>

int fac(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * fac(n - 1);
    }
}

int main() {
    int n;
    printf("Enter a number: ");
    scanf("%d", &n);

    printf("%d! = %d", n, fac(n));
    return 0;
}
factorial2.cpp
#include <iostream>

using namespace std;

int fac(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * fac(n - 1);
    }
}

int main() {
    int n;
    cout << "Enter a number: ";
    cin >> n;

    cout << n << "! = " << fac(n) << endl;
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม เมื่อเรากรอกค่านำเข้าเป็น 10 และ 0 ตามลำดับ

Enter a number: 10
10! = 3628800
Enter a number: 0
0! = 1

ในตัวอย่างนี้ เป็นโปรแกรมคำนวณหาค่าแฟกทอเรียลโดยการใช้ฟังก์ชัน Recursive ซึ่งเป็นฟังก์ชันที่เรียกใช้ตัวเองซ้ำๆ จนกว่าจะได้ผลลัพธ์ตามที่ต้องการ

int fac(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * fac(n - 1);
    }
}

ฟังก์ชัน fac เป็นฟังก์ชัน Recursive สำหรับคำนวณหาค่าแฟกทอเรียล ในขณะที่พารามิเตอร์ n ไม่เท่ากับ 0 ฟังก์ชันจะเรียกตัวของมันเองด้วยคำสั่ง fac(n - 1) ซึ่งจะเป็นการลดค่าของพารามิเตอร์จนเท่ากับ 0 เพื่อหยุดเรียกตัวเอง จากนั้นผลลัพธ์จากการเรียกใช้ตัวเองจะถูกส่งกลับและนำมาคูณกันเพื่อสร้างผลลัพธ์สุดท้าย

นี่เป็นแผนภาพการทำงานของฟังก์ชัน fac ซึ่งแบ่งการทำงานเป็นสองขั้นตอนคือการเรียกตัวเอง และการรวบรวมค่าที่ส่งกลับมาคูณกันเพื่อสร้างคำตอบ ซึ่งก็คือค่าแฟกทอเรียล

// 1. Reclusive calls
fac(5)
5 * fac(4)
    4 * fac(3)
        3 * fac(2)
            2 * fac(1)
                1 * fac(0)
                    1
// 2. Gather result back
1 * 1 * 2 * 3 * 4 * 5 -> fac(5) -> 120

ข้อจำกัดของโปรแกรม

โปรแกรมหาค่าแฟกทอเรียลของเรานั้นยังมีข้อจำกัดในเรื่องขนาดของตัวเลข เนื่องจากมันสามารถทำงานได้กับค่า n ที่ไม่เกิน 13 เท่านั้น นั่นเป็นเพราะว่าเมื่อตัวเลขที่ต้องการนำมาหาค่าแฟกทอเรียลมากกว่า 13 ผลลัพธ์ของมันคือ 6,227,020,800 ซึ่งนี่เกินขนาดสูงสุดที่ตัวเลขในภาษา C และภาษา C++ จะรับได้ เพื่อแก้ปัญหานี้ เราต้องเขียนอัลกอริทึมเพื่อจัดการตัวเลขขนาดใหญ่ด้วยตัวเอง ซึ่งไม่ได้ครอบคลุมในบทเรียนนี้

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการเขียนโปรแกรมเพื่อหาค่าแฟกทอเรียลในภาษา C และภาษา C++ ซึ่งจุดเริ่มต้นของการนำไปประยุกต์ใช้งานในด้านอื่นๆ ต่อไป