Tìm ước chung lớn nhất trong C, C++
Trong bài học này, bạn sẽ tìm ước chung lớn nhất (UCLN) của hai số nguyên bằng thuật toán Euclid.
Giới thiệu
Ước chung lớn nhất (UCLN) của hai số là số lớn nhất mà cả hai số đều chia hết. Thuật toán Euclid tìm UCLN bằng cách liên tục thay cặp số (a, b) bằng (b, phần dư khi chia a cho b), cho đến khi phần dư bằng 0.
Những điểm quan trọng
- Luôn bật cảnh báo của trình biên dịch (compiler warning) và sửa hết các cảnh báo.
- Hiểu rõ kiểu dữ liệu và thời gian tồn tại (lifetime) của từng giá trị.
- Luôn kiểm tra dữ liệu đầu vào và giới hạn chỉ số của mảng.
Code ví dụ bằng C và C++
#include <stdio.h>
int main(void) {
int left = 48, right = 18;
// Reduce the pair until no remainder remains.
while (right) { int remainder = left % right; left = right; right = remainder; }
printf("gcd=%d\n", left);
}
gcd=6
#include <iostream>
#include <numeric>
int main() {
// std::gcd implements Euclid's algorithm.
std::cout << "gcd=" << std::gcd(48, 18) << '\n';
}
gcd=6
So sánh C và C++
Ở mỗi vòng lặp, chương trình tính remainder = left % right, sau đó gán left = right và right = remainder. Khi right bằng 0, giá trị còn lại trong left chính là UCLN. Với 48 và 18, kết quả là gcd=6.
C dùng các hàm thủ tục gọn nhẹ và thể hiện rõ cách dữ liệu được biểu diễn trong bộ nhớ.
C++ vẫn cho phép làm việc ở mức thấp nhưng bổ sung các kiểu dữ liệu thư viện và công cụ trừu tượng an toàn hơn.
Bài tập mở rộng
Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.
- Thử nhập dữ liệu sai và các giá trị ở biên.
- Biên dịch với các cờ -Wall -Wextra -Wpedantic để bật thêm cảnh báo.
- Tách phần khai báo dùng chung ra file header và phần cài đặt ra file riêng.
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ễ