Bài 2.21. Thực hành Python: tính tổng các số chia hết cho 3

Chào mừng các bạn đến với bài thực hành Python ngày hôm nay! Trong bài này, chúng ta sẽ cùng nhau giải quyết một bài toán khá phổ biến nhưng vô cùng quan trọng để rèn luyện tư duy logic và kỹ năng sử dụng vòng lặp, điều kiện trong Python: tính tổng các số chia hết cho 3 trong một phạm vi hoặc danh sách cho trước.

Đây không chỉ là một bài tập cơ bản mà còn là nền tảng cho nhiều vấn đề phức tạp hơn sau này. Hãy cùng khám phá các cách tiếp cận khác nhau để giải quyết bài toán này nhé!

Hiểu rõ yêu cầu: Chia hết cho 3

Trước khi bắt tay vào code, chúng ta cần hiểu rõ khái niệm "chia hết cho 3". Trong toán học, một số nguyên n được gọi là chia hết cho 3 nếu phép chia n cho 3 có số dư bằng 0.

Trong Python, chúng ta có một toán tử cực kỳ hữu ích để kiểm tra điều này: toán tử modulo (%). Phép toán a % b sẽ trả về phần dư của phép chia a cho b.

Như vậy, để kiểm tra xem một số n có chia hết cho 3 hay không, chúng ta chỉ cần kiểm tra điều kiện:

n % 3 == 0

Nếu điều kiện này là True, thì n chia hết cho 3. Quá đơn giản phải không nào? Bây giờ, hãy áp dụng nó vào việc tính tổng.

Cách 1: Sử dụng vòng lặp for và câu lệnh if

Đây là cách tiếp cận trực quan và dễ hiểu nhất, đặc biệt là đối với những bạn mới bắt đầu. Ý tưởng là chúng ta sẽ duyệt qua từng số trong một dãy số (ví dụ: từ 1 đến 100), kiểm tra xem số đó có chia hết cho 3 không. Nếu có, chúng ta cộng số đó vào một biến lưu trữ tổng.

Ví dụ 1: Tính tổng các số chia hết cho 3 từ 1 đến 50

# Khởi tạo biến để lưu tổng
tong_cac_so_chia_het_cho_3 = 0

# Xác định phạm vi cần tính toán (từ 1 đến 50)
# range(1, 51) sẽ tạo ra các số từ 1 đến 50 (không bao gồm 51)
gioi_han_tren = 50

print(f"Tính tổng các số chia hết cho 3 trong khoảng từ 1 đến {gioi_han_tren}:")

# Dùng vòng lặp for để duyệt qua từng số
for so_hien_tai in range(1, gioi_han_tren + 1):
    # Kiểm tra xem số hiện tại có chia hết cho 3 không
    if so_hien_tai % 3 == 0:
        # Nếu chia hết, in ra số đó (để dễ theo dõi) và cộng vào tổng
        print(f"   - Tìm thấy số: {so_hien_tai}")
        tong_cac_so_chia_het_cho_3 += so_hien_tai # Đây là phép cộng dồn

# Sau khi vòng lặp kết thúc, in ra kết quả tổng
print(f"\n=> Tổng các số chia hết cho 3 từ 1 đến {gioi_han_tren} là: {tong_cac_so_chia_het_cho_3}")

Giải thích code:

  1. tong_cac_so_chia_het_cho_3 = 0: Chúng ta cần một biến để tích lũy tổng. Ban đầu, tổng này bằng 0.
  2. gioi_han_tren = 50: Xác định giới hạn trên của dãy số.
  3. for so_hien_tai in range(1, gioi_han_tren + 1): Vòng lặp for này sẽ lần lượt gán giá trị từ 1, 2, 3, ..., đến 50 cho biến so_hien_tai. Lưu ý range(start, stop) sẽ tạo dãy số từ start đến stop - 1, nên chúng ta cần dùng gioi_han_tren + 1.
  4. if so_hien_tai % 3 == 0:: Đây là trái tim của logic. Chúng ta kiểm tra điều kiện chia hết cho 3.
  5. tong_cac_so_chia_het_cho_3 += so_hien_tai: Nếu điều kiện đúng (số chia hết cho 3), giá trị của so_hien_tai được cộng vào biến tổng. Phép += là cách viết tắt của tong_cac_so_chia_het_cho_3 = tong_cac_so_chia_het_cho_3 + so_hien_tai.
  6. print(...): In ra kết quả cuối cùng sau khi vòng lặp đã duyệt qua tất cả các số.

Cách này rất rõ ràng, từng bước một, giúp bạn hình dung được quá trình tính toán.

Cách 2: Sử dụng List Comprehension và hàm sum()

Python cung cấp một cú pháp ngắn gọn và thanh lịch hơn để tạo danh sách dựa trên một dãy hoặc một danh sách khác, đó là List Comprehension. Kết hợp với hàm sum() có sẵn để tính tổng các phần tử trong một list, chúng ta có thể giải quyết bài toán này chỉ trong một dòng code!

Ví dụ 2: Tính tổng các số chia hết cho 3 từ 1 đến 50 (bằng List Comprehension)

# Xác định phạm vi
gioi_han_tren = 50

# Sử dụng List Comprehension để tạo danh sách các số chia hết cho 3
# và tính tổng trực tiếp bằng hàm sum()
tong_list_comprehension = sum([so for so in range(1, gioi_han_tren + 1) if so % 3 == 0])

# In kết quả
print(f"Tính tổng bằng List Comprehension (1 đến {gioi_han_tren}): {tong_list_comprehension}")

# Bạn cũng có thể xem danh sách các số đã được lọc ra:
danh_sach_so_chia_het_cho_3 = [so for so in range(1, gioi_han_tren + 1) if so % 3 == 0]
print(f"Danh sách các số chia hết cho 3: {danh_sach_so_chia_het_cho_3}")

Giải thích code:

  1. [so for so in range(1, gioi_han_tren + 1) if so % 3 == 0]: Đây chính là List Comprehension. Hãy đọc nó từ trái sang phải:
    • so: Đây là phần tử sẽ được thêm vào danh sách mới.
    • for so in range(1, gioi_han_tren + 1): Chúng ta lặp qua các số từ 1 đến 50, gán từng số cho biến so.
    • if so % 3 == 0: Chúng ta chỉ giữ lại giá trị so nếu nó thỏa mãn điều kiện chia hết cho 3. Kết quả của biểu thức này là một danh sách mới, chỉ chứa các số từ 1 đến 50 mà chia hết cho 3 (ví dụ: [3, 6, 9, ..., 48]).
  2. sum(...): Hàm sum() nhận đầu vào là một iterable (như list, tuple) và trả về tổng của tất cả các phần tử trong đó.

Cách này thể hiện sức mạnh và sự linh hoạt của Python, giúp code ngắn gọn và dễ đọc hơn (khi bạn đã quen với cú pháp).

Mở rộng: Tính tổng từ một danh sách có sẵn

Bài toán không nhất thiết phải tính tổng trên một dãy số liên tục. Chúng ta hoàn toàn có thể áp dụng các kỹ thuật tương tự để tính tổng các số chia hết cho 3 từ một danh sách (list) hoặc tuple cho trước.

Ví dụ 3: Tính tổng các số chia hết cho 3 trong một danh sách cụ thể

danh_sach_so = [12, 5, 9, 27, 10, 8, 15, 4, 21]
tong_tu_danh_sach = 0

print(f"\nTính tổng các số chia hết cho 3 từ danh sách: {danh_sach_so}")

# Cách 1: Dùng for và if
for so in danh_sach_so:
    if so % 3 == 0:
        print(f"   - Số {so} chia hết cho 3")
        tong_tu_danh_sach += so
print(f"=> Tổng (dùng for/if): {tong_tu_danh_sach}")

# Cách 2: Dùng List Comprehension và sum()
tong_tu_danh_sach_lc = sum([so for so in danh_sach_so if so % 3 == 0])
print(f"=> Tổng (dùng List Comprehension): {tong_tu_danh_sach_lc}")

Giải thích code:

Logic hoàn toàn tương tự như các ví dụ trước. Điểm khác biệt duy nhất là thay vì dùng range() để tạo dãy số, chúng ta duyệt trực tiếp qua các phần tử của danh_sach_so đã cho. Cả hai cách tiếp cận (vòng lặp for/if và List Comprehension) đều hoạt động hiệu quả.

Tại sao bài toán này lại quan trọng?

Việc tính tổng các số thỏa mãn một điều kiện nào đó (như chia hết cho 3) là một bài tập cơ bản nhưng cốt lõi trong lập trình. Nó giúp bạn luyện tập:

  1. Vòng lặp (for): Duyệt qua một tập hợp dữ liệu (dãy số, danh sách).
  2. Câu lệnh điều kiện (if): Lọc ra những phần tử thỏa mãn yêu cầu cụ thể.
  3. Thao tác với biến: Khởi tạo và cập nhật giá trị (biến tổng).
  4. Sử dụng hàm tích hợp (sum()): Tận dụng các công cụ có sẵn của ngôn ngữ để viết code hiệu quả hơn.
  5. Pythonic Code (List Comprehension): Học cách viết code theo phong cách đặc trưng, ngắn gọn và mạnh mẽ của Python.

Nắm vững những kỹ năng này sẽ là bước đệm vững chắc để bạn giải quyết những bài toán phức tạp hơn trong tương lai.

Hãy thử tự mình thay đổi giới hạn trên, thay đổi điều kiện (ví dụ: tính tổng các số chia hết cho 5, hoặc các số chẵn) để hiểu sâu hơn nhé! Chúc các bạn thực hành vui vẻ và hiệu quả!

Comments

There are no comments at the moment.