Em hãy quan sát và cho nhận xét về các cách viết chương trình tìm ước số chung lớn nhất của hai số nguyên dương a, b cho trước sau đây:

```
Chương trình 1
1 a = int(input("Nhập a = "))
2 b = int(input("Nhập b = "))
3 while b > 0:
4 r = a % b
5 a = b
6 b = r
7 print(a)
Chương trình 2
1 import math
2 a = int(input("Nhập a = "))
3 b = int(input("Nhập b = "))
4 print(math.gcd(a,b))
```
*Chương trình 1:
- Thuật toán: Chương trình 1 dường như đang cố gắng thực hiện thuật toán Euclid để tìm ƯCLN, nhưng có một số lỗi trong logic:
- Dòng b = r không cập nhật đúng giá trị của b sau mỗi vòng lặp, vì không có phép toán nào để tính giá trị mới của b.
-Cần sử dụng phép toán chia để cập nhật b và a theo công thức Euclid: a, b = b, a % b.
- Kết quả: Chương trình sẽ không cho ra kết quả đúng do lỗi logic.
-Độ phức tạp: Phức tạp hơn và dễ gây nhầm lẫn cho người mới học lập trình.
*Chương trình 2:
- Thuật toán: Chương trình 2 sử dụng hàm có sẵn math.gcd() từ thư viện math, rất hiệu quả và chính xác để tìm ƯCLN.
- Kết quả: Chương trình sẽ cho ra kết quả chính xác mà không cần người dùng phải hiểu rõ thuật toán bên trong.
- Độ phức tạp: Đơn giản hơn, dễ bảo trì và ít lỗi hơn vì không cần phải tự viết thuật toán.
*Kết luận
- Chương trình 1: Mặc dù có thể là một cách tiếp cận thú vị để học về thuật toán Euclid, nhưng nó dễ gây lỗi và không cho ra kết quả đúng.
- Chương trình 2: Là lựa chọn tốt hơn cho việc tìm ƯCLN vì nó sử dụng hàm có sẵn, đơn giản, dễ hiểu và chính xác.
=> Do đó, nếu em cần tìm ƯCLN một cách nhanh chóng và chính xác, chương trình 2 là sự lựa chọn ưu việt hơn.