Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình C++ tính tổng chuỗi 1/1! + 2/2! + 3/3! + ... + n/n!

Tính tổng chuỗi: S = 1/1! + 2/2! + 3/3! + ... + n/n!

Tối ưu: dùng giai thừa trước để tính giai thừa sau (k! = k × (k-1)!), tránh tính lại từ đầu.

Thuật toán

sumSeriesFact(n):
    res = 0
    denominator = 1  // 0! = 1
    for i = 1 to n:
        denominator *= i    // i!
        res += i / denominator
    return res
end

Code ví dụ

#include <iostream>
#include <iomanip>
using namespace std;

double seriesSum(int n) {
    double denominator = 1.0;
    double res = 0.0;
    
    for(int i = 1; i <= n; i++) {
        denominator *= i;        // i!
        res += i / denominator;  // i / i!
    }
    return res;
}

int main() {
    int n;
    cout << "Nhap so hang n: ";
    cin >> n;
    
    cout << fixed << setprecision(10);
    cout << "Tong S = " << seriesSum(n) << endl;
    
    // So sánh với e - 1 (khi n -> oo, tong tien den e - 1 ~= 1.71828)
    cout << "e - 1 = " << M_E - 1 << endl;
    
    return 0;
}

Kết quả

Nhap so hang n: 5
Tong S = 2.7083333333
e - 1 = 1.7182818285
Nhap so hang n: 3
Tong S = 2.5000000000
e - 1 = 1.7182818285

⚠️ Sửa lỗi logic quan trọng

Code gốc có lỗi: float(i/denominator) - phép chia nguyên xảy ra TRƯỚC khi ép kiểu. Phải viết i / denominator với denominator là double.

Đúng: res += i / denominator; (denominator là double)

Sai: res += float(i/denominator); (i/denominator tính ở integer)

Giá trị giới hạn

Khi n → ∞, chuỗi tiến tới e - 1 ≈ 1.718281828459...

Kết quả mẫu n=5 cho 2.70833 vì n còn nhỏ. n=10: ~1.7182818, n=15: ~1.718281828459.

Độ phức tạp

  • Thời gian: O(n)
  • Không gian: O(1)