#include <iostream>
using namespace std;
int ucln(int, int); // Hàm tìm Ước chung lớn nhất (UCLN) của hai số
int bcnn(int, int); // Hàm tìm Bội chung nhỏ nhất (BCNN) của hai số
int ucln_nhi(int, int); // Hàm tìm Ước chung lớn nhì (UCLNh) của hai số
void nhap_so(int&, int&); // Hàm nhập giá trị cho hai số
void in_ket_qua(int, int); // Hàm in kết quả ra màn hình
int main() {
int a, b;
nhap_so(a, b); // Gọi hàm nhập dữ liệu cho hai số a và b
in_ket_qua(a, b); // Gọi hàm in kết quả ra màn hình
return 0;
}
void nhap_so(int &a, int &b) {
do {
cout << "Nhap so dau tien : ";
cin >> a;
cout << "Nhap so thu hai : ";
cin >> b;
// Kiểm tra điều kiện hợp lệ (hai số phải dương)
if (a <= 0 || b <= 0) {
cout << "Nhap so khong hop le! Vui long nhap lai!\n";
}
} while (a <= 0 || b <= 0); // Nếu nhập sai, yêu cầu nhập lại
}
// Hàm tìm Ước chung lớn nhất (UCLN) bằng thuật toán Euclid
int ucln(int a, int b) {
// Lặp cho đến khi phần dư bằng 0
while (b != 0) {
int r = a % b; // Lấy phần dư của a chia b
a = b; // Gán lại a = b
b = r; // Gán b = phần dư
}
return a; // Khi b = 0, a chính là UCLN
}
// Công thức: BCNN(a, b) = (a * b) / UCLN(a, b)
int bcnn(int a, int b) {
return (a * b) / ucln(a, b);
}
int ucln_nhi(int a, int b) {
int g = ucln(a, b); // Gọi lại hàm UCLN để lấy ước lớn nhất
int ucln2 = 1; // Biến lưu ước lớn nhì (ban đầu gán = 1)
// Duyệt ngược từ g/2 về 1 để tìm ước lớn thứ 2 của g
for (int i = g / 2; i >= 1; i--) {
if (g % i == 0) { // Nếu i là ước của g
ucln2 = i; // Gán giá trị cho ucln2
break; // Thoát khỏi vòng lặp ngay (vì i là ước lớn thứ 2)
}
}
return ucln2; // Trả về ước chung lớn nhì
}
void in_ket_qua(int a, int b) {
cout << "Uoc chung lon nhat cua hai so " << a << " va " << b
<< " la " << ucln(a, b) << "\n";
cout << "Boi chung nho nhat cua hai so " << a << " va " << b
<< " la " << bcnn(a, b) << "\n";
cout << "Uoc chung lon nhi cua hai so " << a << " va " << b
<< " la " << ucln_nhi(a, b) << "\n";
}