Hướng dẫn giải của Tính tổng S = 1/2 + 1/3 + ... + 1/n


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.

Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.

Bạn phải đăng nhập để mở lời giải này.

Đăng nhập

Tác giả: Hiếu Nguyễn, mufininstinct, tle778047, nguyencongk53e

Hiểu bài toán

Bài toán yêu cầu tính tổng S là tổng của các phân số từ 1/2 đến 1/n. Với n là số nguyên dương (2 ≤ n ≤ 10^4). Ví dụ, nếu n = 5 thì S = 1/2 + 1/3 + 1/4 + 1/5. Kết quả cần được in ra với độ chính xác 4 chữ số thập phân.

Các cách tiếp cận

Cách Vòng lặp cơ bản với biến kiểu float
#include <stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    float tong = 0;
    for(int i = 2; i <= n; i++){
        tong += 1.0/i;
    }
    printf("%.4f", tong);
    return 0;
}
  • Time Complexity: O(n)
  • Space Complexity: O(1)

Đây là cách tiếp cận trực tiếp nhất. Khai báo biến tổng kiểu float, sử dụng vòng lặp từ 2 đến n, cộng dồn giá trị 1.0/i vào biến tổng. Cuối cùng in kết quả với format %.4f để làm tròn 4 chữ số thập phân. Kiểu float cung cấp đủ độ chính xác cho n ≤ 10^4.

Cách Vòng lặp cơ bản với biến kiểu double
#include <stdio.h>
int main(){
    int n;
    double s = 0;
    scanf ("%d", &n);
    for (int i = 2; i <= n; i++){
        s += (double)(1.0 / i);
    }
    printf ("%.4f", s);
    return 0;
}
  • Time Complexity: O(n)
  • Space Complexity: O(1)

Tương tự cách tiếp cận đầu tiên nhưng sử dụng kiểu double thay vì float. Double có độ chính xác cao hơn (khoảng 15-17 chữ số thập phân), giúp giảm thiểu sai số làm tròn. Phép chia 1.0/i được ép kiểu rõ ràng để đảm bảo tính toán chính xác.

Cách Vòng lặp với biến kiểu double và ép kiểu an toàn
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a;
    scanf("%d",&a);
    double tong=0;
   for(int i=2;i<=a;i++)
   {
       tong=tong+(double)1/i;
   }
printf("%.4lf",tong);
    return 0;
}
  • Time Complexity: O(n)
  • Space Complexity: O(1)

Cách tiếp cận này cũng sử dụng double nhưng có cú pháp ép kiểu (double)1/i. Lưu ý rằng trong C, ép kiểu (double) cho số nguyên 1 sẽ biến 1 thành số thực trước khi thực hiện phép chia, đảm bảo kết quả là số thực chính xác. Sử dụng %.4lf cho kiểu double trong printf.

Phân tích độ phức tạp

Cách tiếp cận Time Space Tên
1 O(n) O(1) Vòng lặp cơ bản với biến kiểu float
2 O(n) O(1) Vòng lặp cơ bản với biến kiểu double
3 O(n) O(1) Vòng lặp với biến kiểu double và ép kiểu an toàn

Bài học kinh nghiệm

  • Nên sử dụng kiểu double thay vì float để có độ chính xác cao hơn cho các phép tính số thực
  • Đảm bảo phép chia 1/i được thực hiện trong chế độ số thực (bằng cách dùng 1.0/i hoặc ép kiểu) để tránh kết quả là 0
  • Độ phức tạp thời gian O(n) là chấp nhận được với n ≤ 10^4

Lỗi thường gặp

  • Sử dụng số nguyên 1/i sẽ cho kết quả là 0 (integer division) nếu i > 1
  • Quên in kết quả với định dạng 4 chữ số thập phân (%.4f)
  • Biến tổng không được khởi tạo hoặc khởi tạo sai kiểu dữ liệu

Bình luận

Please read the guidelines before commenting.


Không có bình luận tại thời điểm này.