Giảm số đang xét sau mỗi lần tìm được ước
Với số nguyên **n từ 1 trở lên**, đặt `m=n` và bắt đầu thử ước `k=2`. Khi k chia hết m, thêm k vào danh sách rồi lấy `m//k`; nếu chưa chia hết, tăng k. Khi m còn 1, tích các phần tử tìm được bằng n. Số 1 cho list rỗng vì không có thừa số nguyên tố; số nguyên tố cho list đúng một phần tử là chính nó.
Nhiệm vụ: lưu mã sau vào tệp `phan-tich-thua-so.py`, chạy và đối chiếu ba trường hợp:
```python
def thua_so(n):
if n < 1:
return None
m, k = n, 2
ket_qua = []
while m > 1:
if m % k == 0:
ket_qua.append(k)
m = m // k
else:
k = k + 1
return ket_qua
for n in [1, 12, 13]:
print(n, thua_so(n))
```
Kết quả là `1 []`, `12 [2, 2, 3]`, `13 [13]`. Với 12, các trạng thái sau phép chia là m=6,3,1; tích 2×2×3=12. Thử thêm n=0: hàm trả `None` để báo ngoài phạm vi, tránh kết luận 0 là số nguyên tố. Nếu kết quả sai, in m,k,ket_qua trước mỗi phép chia để tìm vòng lặp gây lệch.
Bài luyện
Hàm `thua_so(12)` trả list nào?
Tích 2×3 chỉ bằng 6.
2×2×3=12.
1 không là thừa số nguyên tố.
12 là hợp số, không phải một thừa số nguyên tố.
Lời giải
12 chia 2 được 6, tiếp tục chia 2 được 3, rồi chia 3 được 1. List thừa số là `[2,2,3]`.
Bài luyện
Với n=1, vì sao hàm trả `[]`?
1 không phải số nguyên tố.
m=1 làm điều kiện while sai ngay; list ban đầu còn rỗng.
Không có phép chia cho 0.
Không có lệnh xóa list.
Lời giải
Ban đầu m=1 nên vòng lặp `while m>1` không chạy. Danh sách rỗng đúng với việc số 1 không có thừa số nguyên tố.
Bài luyện
Cách kiểm nhanh list `[2, 2, 3]` có thể là phân tích của 12 là gì?
Tổng không kiểm phép phân tích thành tích.
2×2×3=12 bằng số gốc.
Độ dài không chứng minh tích đúng.
Một thừa số riêng không đủ.
Lời giải
Phân tích thừa số cần tích các phần tử bằng số ban đầu. `2×2×3=12`, đúng với n=12.
Đang học