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)