Liệt kê ước số

Bài tập F44: Liệt kê ước số

Viết chương trình nhập vào một số nguyên dương n và in ra tất cả các ước số của n.


Cách 1: Một trong những giải pháp đơn giản là thử mọi giá trị số nguyên d từ l tới n, mỗi khi gặp một giá trị ở là ước số của n thì in ra ngay giá trị d đó. Tham khảo chương trình sau:

Liệt kê ước số

Ví dụ: 

Input

Output

60

1     2     3     4     5     6     10     12     15     20     30     60

Cách 2: Cách làm trên khá chậm khi gặp giá trị n lớn (chẳng hạn n = 109). Một cải tiến nhỏ là dựa vào nhận xét: Ngoại trừ ước d = n, tất cả các ước số khác của n đều không vượt quá $\frac{n}{2}$, vì vậy ta chỉ cần thử d trong phạm vi $\begin{bmatrix}1;\frac{n}{2}&\end{bmatrix}$ còn riêng ước d = n sẽ được in ra sau. Mặc dù tốc độ chương trình cải thiện gấp đôi, phương pháp này vẫn còn rất chậm.

Cách 3: Dựa vào nhận xét: Nếu d là ước số của n thì $\frac{n}{d}$ cũng là ước số của n. Trong hai ước số d và $\frac{n}{d}$, chắc chắn có một số nhỏ hơn hoặc bằng $\sqrt{n}$. Vì thế ta chỉ cần thử d trong phạm vi [1; $\sqrt{n}$], khi tìm thấy một ước số d của n trong phạm vi này, ta in ra d và in ra luôn cả ước $\frac{n}{d}$.

Lưu ý: Trường hợp d = $\frac{n}{d}$ (n là số chính phương), ta chỉ được in ra một ước để tránh trùng lặp.

Tham khảo chương trình sau:

Liệt kê ước số


Bình luận

Giải bài tập những môn khác