Bắt đầu từ định nghĩa
Đầu vào là một số nguyên `n ≥ 0`; đầu ra là `True` nếu `n` nguyên tố, `False` nếu không. Theo định nghĩa, số nguyên tố **lớn hơn 1** và chỉ có hai ước dương là 1 và chính nó. Từ yêu cầu này, chia thành ba bước: nếu `n ≤ 1` thì trả `False`; nếu tìm thấy một ước `k` từ 2 đến `n−1` thì trả `False` ngay; nếu thử xong mà không thấy ước nào thì trả `True`. Trường hợp `n = 2` có khoảng thử rỗng, nên trả `True`.
Các nhánh trả về phải ở đúng chỗ
```python
def la_nguyen_to(n):
if n <= 1:
return False
for k in range(2, n):
if n % k == 0:
return False
return True
print([la_nguyen_to(n) for n in (0, 1, 2, 9, 11)])
```
Kết quả là `[False, False, True, False, True]`. Với 9, `k = 3` là ước nên dừng sớm. Lệnh `return True` đặt **sau** vòng `for`: chỉ khi không tìm được ước thực sự mới kết luận là nguyên tố. Đây là cách thử ước từ 2 đến `n−1` theo SGK; có thể tối ưu về sau khi đã hiểu đúng quy trình.
Bài luyện
Vì sao `la_nguyen_to(1)` trả `False`?
1 chỉ có một ước dương.
Định nghĩa yêu cầu số nguyên tố lớn hơn 1.
1 không là số chẵn.
Mã trả trước vòng thử ước.
Lời giải
Số nguyên tố phải lớn hơn 1; nhánh n <= 1 xử lí n=1 ngay.
Bài luyện
Trong mã bài học, `la_nguyen_to(2)` trả gì?
2 có đúng hai ước dương là 1 và 2.
Vòng rỗng không làm kết quả sai.
Vòng for không chạy; lệnh return True được thực hiện.
range rỗng hợp lệ trong Python.
Lời giải
2 > 1; range(2, 2) rỗng, nên không phát hiện ước thực sự và hàm trả True.
Bài luyện
Với `n = 9`, điều gì khiến hàm trả `False`?
3 là ước thực sự của 9.
9 lớn hơn 1.
Vòng thử k=2,3,... có chạy.
Có nhiều số lẻ nguyên tố, như 11.
Lời giải
Khi k=3, 9 chia hết cho 3; hàm trả False ngay vì 9 có ước khác 1 và chính nó.
Đang học