Cho n. Tính S = 1/1 + (1+2)/(1·2) + (1+2+3)/(1·2·3) + ... + (1+...+n)/(1·2·...·n).
Ví dụ
n = 3: S = 1/1 + 3/2 + 6/6 = 1 + 1.5 + 1 = 3.5
Thuật toán
Duyệt i = 1..n, duy trì sum_i = i(i+1)/2 và fact_i = i!. Cộng sum_i / fact_i vào kết quả.
Độ phức tạp O(n). Giai thừa tăng rất nhanh, double đủ cho n ≤ 170.
Chương trình C++
#include <iostream>
#include <iomanip>
using namespace std;
double calcSeriesSum(int n) {
double result = 0.0;
long long sum = 0;
long long fact = 1;
for (int i = 1; i <= n; i++) {
sum += i;
fact *= i;
result += (double)sum / fact;
}
return result;
}
int main() {
int n = 12;
cout << fixed << setprecision(5)
<< "Tong chuoi = " << calcSeriesSum(n); // 4.07742
return 0;
}
Kết quả
Tong chuoi = 4.07742
Quan sát thêm
Số hạng thứ i: i(i+1)/(2·i!) = (i+1)/(2·(i-1)!). Chuỗi hội tụ nhanh về e/2 ≈ 1.359 cho mỗi số hạng sau, tổng tiến tới giá trị hữu hạn.