Thuật toán Euclid tìm ƯCLN trong Python
Tìm ước chung lớn nhất chỉ trong vài bước bằng mẹo chia lấy dư của Euclid, rồi so sánh với math.gcd.
- Ước chung lớn nhất là gì
- Thuật toán Euclid
- math.gcd trong thư viện chuẩn
48 % 18 = 12→ (18, 12)18 % 12 = 6→ (12, 6)12 % 6 = 0→ gcd = 6
Thay cặp số bằng (b, a % b)
Ước chung lớn nhất (UCLN) của hai số nguyên là số nguyên dương lớn nhất mà cả hai số đều chia hết. Thuật toán Euclid tìm UCLN rất nhanh dựa trên một tính chất đơn giản, UCLN của a và b cũng bằng UCLN của b và phần dư khi chia a cho b.
Những điểm quan trọng
gcd(a, b)bằnggcd(b, a % b).- Lặp lại cho đến khi số dư bằng 0; số còn lại là đáp án.
math.gcd(48, 18)cho cùng kết quả.
Khi nào nên sử dụng?
- Rèn luyện tư duy giải quyết vấn đề và hiểu cách thuật toán hoạt động qua từng bước.
- Chọn được cách giải phù hợp khi cần xử lý nhiều dữ liệu hoặc cần chương trình chạy nhanh hơn.
- Chuẩn bị cho các kỳ thi, bài tập và phỏng vấn lập trình.
Code ví dụ
def gcd(first, second):
while second:
first, second = second, first % second
return abs(first)
print(gcd(48, 18))
Kết quả khi chạy
6
Giải thích code
Ở mỗi bước, cặp số (first, second) được thay bằng (second, first % second). Khi phần dư bằng 0, giá trị còn lại trong first chính là UCLN, nên UCLN của 48 và 18 là 6. Hàm abs() đảm bảo kết quả luôn dương. Số bước cần thực hiện tăng rất chậm theo độ lớn của số, khoảng O(log n).
Thay đổi giá trị và chạy chương trình bằng trình chạy Python online của CodeUtility mà không cần cài Python.
Bài tập mở rộng
Hãy thử chỉnh sửa code theo các gợi ý dưới đây. Tự thay đổi và quan sát kết quả sẽ giúp bạn hiểu bài sâu hơn nhiều so với chỉ đọc code.
- Thử với danh sách rỗng, danh sách chỉ có một phần tử hoặc có giá trị trùng lặp.
- In ra trạng thái sau mỗi bước để quan sát thuật toán hoạt động.
- Đo thời gian chạy với 100, 1.000 và 10.000 phần tử, rồi so sánh với một cách giải khác.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
- Ước số chung lớn nhất Tìm số lớn nhất chia hết cho cả hai giá trị. Dễ
- Bội số chung nhỏ nhất Tìm số dương nhỏ nhất chia hết cho cả hai giá trị. Dễ
- Phép toán phân số chính xác Thực hiện các phép toán phân số và trả về phân số tối giản. Trung bình