Biến đếm chỉ tăng khi điều kiện đúng
Trong đoạn mã, `k` chạy từ 1 đến 10. `dem` bắt đầu 0 và chỉ tăng khi `k % 3 == 0`. Các giá trị thỏa là 3, 6, 9 nên kết quả in là 3:
```python
dem = 0
for k in range(1, 11):
if k % 3 == 0:
dem = dem + 1
print(dem)
```
Vòng for chạy mười lượt, nhưng **số được đếm** chỉ có ba. Đừng nhầm số lượt xét với số lần điều kiện đúng.
Bài luyện
Vòng trong bài xét từ 1 đến 10, đếm số chia hết cho 3. `dem` cuối cùng là mấy?
10 là số lượt xét, không phải số thỏa.
3, 6, 9 là ba số thỏa.
9 là một giá trị được xét, không là số đếm.
Có ba lượt tăng biến đếm.
Lời giải
Các giá trị chia hết cho 3 trong 1–10 là 3, 6, 9. Mỗi giá trị làm `dem` tăng 1 nên cuối cùng `dem = 3`.
Ước của n được tìm bằng phép dư
Nhiệm vụ: tạo `uoc-so.py`, đặt `n = 10` và in các ước dương. Chỉ xét `n` nguyên dương vì phép chia cho `k` phải có `k >= 1` và khái niệm số ước của 0 không phù hợp bài này.
```python
n = 10
for k in range(1, n + 1):
if n % k == 0:
print(k, end=" ")
```
Kết quả là `1 2 5 10`. Thử `n = 1` thì chỉ in `1`. Nếu cần **ước thực sự** (nhỏ hơn n), đổi vùng xét thành `range(1, n)`; với n = 10 còn `1 2 5`, với n = 1 không có ước thực sự. Nếu thiếu n trong kết quả tìm mọi ước, kiểm điểm dừng có phải `n + 1` hay không.
Bài luyện
Mã tìm mọi ước của `n = 10` trong bài in dãy nào?
Cả 1, 2, 5, 10 đều chia hết 10 và vùng xét có 10.
Dãy này bỏ n, là các ước thực sự.
Thiếu ước 1.
Không phải mọi số 1–10 đều là ước.
Lời giải
Kiểm từng k từ 1 đến 10 bằng `10 % k == 0`. Điều kiện đúng ở k = 1, 2, 5, 10.
Bài luyện
Muốn chỉ in ước thực sự của `n = 10` bằng mã trên, cần đổi vùng xét thành gì?
k = 0 khiến phép lấy dư theo 0 lỗi.
Xét 1 đến trước n, loại n.
Vùng này vẫn gồm n.
Vùng này chỉ có n.
Lời giải
Ước thực sự phải nhỏ hơn n. `range(1, n)` xét 1 đến n − 1, nên bỏ n mà vẫn kiểm các ước dương khác.
Bài luyện
Với `n = 1`, mã tìm ước thực sự dùng `range(1, n)` chạy bao nhiêu lượt?
range(1,1) rỗng nên không có lượt nào.
Điểm dừng 1 không được lấy.
Không có hai giá trị trong vùng rỗng.
for trên range rỗng kết thúc ngay.
Lời giải
Thay n = 1 được `range(1, 1)`. Dãy rỗng vì bắt đầu đã bằng điểm dừng, nên vòng lặp không chạy.
Đang học