การหาค่าหาแฟกทอเรียล ในภาษา 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++
#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;
}
#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++
#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;
}
#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++ ซึ่งจุดเริ่มต้นของการนำไปประยุกต์ใช้งานในด้านอื่นๆ ต่อไป