บทนำ
ในบทช่วยสอนนี้ เราจะเขียนโปรแกรมหา หลักแรก (first digit) ของค่าแฟกทอเรียล (Factorial) ของจำนวนที่กำหนด
ตัวอย่าง
Input: 7
Output: 5
(7! = 5040 → หลักแรกคือ 5)
ขั้นตอนการแก้ปัญหา
- กำหนดจำนวน n
- คำนวณแฟกทอเรียลของ n
- หารด้วย 10 ซ้ำๆ จนเหลือหลักเดียว
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
void findFirstDigitOfFactorial(int n) {
long long int fact = 1;
for (int i = 2; i <= n; i++) {
fact = fact * i;
}
while (fact >= 10) {
fact = fact / 10;
}
cout << fact << endl;
}
int main() {
int n = 7;
findFirstDigitOfFactorial(n);
return 0;
}
ผลลัพธ์
5
ข้อจำกัดและการปรับปรุง
ปัญหา: แฟกทอเรียลเติบโตเร็วมาก n=20! ก็ล้น long long แล้ว
วิธีแก้ที่ดีกว่า (ใช้ Logarithm):
int firstDigitOfFactorialLog(int n) {
if (n <= 1) return 1;
double logSum = 0;
for (int i = 2; i <= n; i++) {
logSum += log10(i);
}
double fractional = logSum - floor(logSum);
return (int)pow(10, fractional);
}
วิธีนี้คำนวณได้สำหรับ n ใหญ่มาก (เช่น n=1000000) เพราะไม่คำนวณค่าแฟกทอเรียลจริง
สรุป
วิธีตรงไปตรงมาสำหรับ n เล็ก สำหรับ n ใหญ่ต้องใช้ Logarithm หากมีคำถาม สามารถถามได้ในส่วนความคิดเห็นครับ