Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

หาหลักแรกของแฟกทอเรียลใน C++


บทนำ

ในบทช่วยสอนนี้ เราจะเขียนโปรแกรมหา หลักแรก (first digit) ของค่าแฟกทอเรียล (Factorial) ของจำนวนที่กำหนด

ตัวอย่าง

Input: 7
Output: 5
(7! = 5040 → หลักแรกคือ 5)

ขั้นตอนการแก้ปัญหา

  1. กำหนดจำนวน n
  2. คำนวณแฟกทอเรียลของ n
  3. หารด้วย 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 หากมีคำถาม สามารถถามได้ในส่วนความคิดเห็นครับ