Tìm ước chung lớn nhất trong python

Nội dung chính

  • Đề bài
  • Định nghĩa
  • Lời giải
  • 1. Tìm USCLN và BSCNN của 2 số nguyên dương trong Python bằng giải thuật Euclid
  • 2. Tìm USCLN và BSCNN của 2 số nguyên dương trong Python bằng cách khác

Bài tập Python: Viết chương trình tìm ước số chung lớn nhất [USCLN] và bội số chung nhỏ nhất [BSCNN] của 2 số nguyên dương a và b nhập từ bàn phím.


Định nghĩa

USCLN của 2 số nguyên dương a và b là một số k lớn nhất, sao cho a và b đều chia hết cho k.

BSCNN của 2 số nguyên dương a và b là một số h nhỏ nhất, sao cho h chia hết cho cả a và b.

Lời giải

Một phương pháp đơn giản đề tìm USCLN của a và b là duyệt từ số nhỏ hơn trong 2 số a và b cho đến 1, khi gặp số nào đó mà cả a và b đều chia hết cho nó thì đó chính là USCLN của a và b. Tuy vậy phương pháp này chưa phải là hiệu quả nhất.

Vào thế kỷ 3 TCN, nhà toán học Euclid [phiên âm tiếng Việt là Ơ-clit] đã phát minh ra một giải thuật tìm USCLN của hai số nguyên dương rất hiệu quả được gọi là giải thuật Euclid. Cụ thể về ý tưởng của bài toán, giả sử a lớn hơn b, khi đó việc tính UCSLN của a và b sẽ được đưa về bài toán tính USCLN của a mod b và b vì USCLN[a, b] = USCLN[a mod b, b].

Khi đã tìm được USCLN thì việc tìm BSCNN của hai số nguyên dương a và b khá đơn giản. Khi đó BSCNN[a, b] = [a * b] / UCSLN[a, b].


1. Tìm USCLN và BSCNN của 2 số nguyên dương trong Python bằng giải thuật Euclid

Ví dụ dưới đây sử dụng giải thuật Euclid để giải quyết bài toán tìm ước số chung lớn nhất [USCLN] và bội số chung nhỏ nhất [BSCNN] của hai số nguyên dương a và b bằng cách sử dụng giải thuật Euclid.

"""
 * Tìm ước số chung lớn nhất [USCLN]
 *
 * @param a: số nguyên dương
 * @param b: số nguyên dương
 * @return USCLN của a và b
"""
def uscln[a, b]:
    if [b == 0]:
        return a;
    return uscln[b, a % b];

"""
 * Tìm bội số chung nhỏ nhất [BSCNN]
 * 
 * @param a: số nguyên dương
 * @param b: số nguyên dương
 * @return BSCNN của a và b
"""
def bscnn[a, b]:
    return int[[a * b] / uscln[a, b]];

a = int[input["Nhập số nguyên dương a = "]];
b = int[input["Nhập số nguyên dương b = "]];
#tính USCLN của a và b
print["Ước số chung lớn nhất của", a, "và", b, "là:", uscln[a, b]];
#tính BSCNN của a và b
print["Bội số chung nhỏ nhất của", a, "và", b, "là:", bscnn[a, b]];

Kết quả:

Nhập số nguyên dương a = 15
Nhập số nguyên dương b = 20
Ước số chung lớn nhất của 15 và 20 là: 5
Bội số chung nhỏ nhất của 15 và 20 là: 60

2. Tìm USCLN và BSCNN của 2 số nguyên dương trong Python bằng cách khác

"""
 * Tìm ước số chung lớn nhất [USCLN]
 *
 * @param a: số nguyên dương
 * @param b: số nguyên dương
 * @return USCLN của a và b
"""
def uscln[a, b]:
    temp1 = a;
    temp2 = b;
    while [temp1 != temp2]:
        if [temp1 > temp2]:
            temp1 -= temp2;
        else:
            temp2 -= temp1;
    uscln = temp1;
    return uscln;

"""
 * Tìm bội số chung nhỏ nhất [BSCNN]
 * 
 * @param a: số nguyên dương
 * @param b: số nguyên dương
 * @return BSCNN của a và b
"""
def bscnn[a, b]:
    return int[[a * b] / uscln[a, b]];

a = int[input["Nhập số nguyên dương a = "]];
b = int[input["Nhập số nguyên dương b = "]];
#tính USCLN của a và b
print["Ước số chung lớn nhất của", a, "và", b, "là:", uscln[a, b]];
#tính BSCNN của a và b
print["Bội số chung nhỏ nhất của", a, "và", b, "là:", bscnn[a, b]];

Kết quả:

Nhập số nguyên dương a = 15
Nhập số nguyên dương b = 20
Ước số chung lớn nhất của 15 và 20 là: 5
Bội số chung nhỏ nhất của 15 và 20 là: 60

Giải thích hoạt động của chương trình trên: Trong chương trình này, tôi nhập vào hai số 15 và 20 thì trình biên dịch sẽ thực thi hàm uscln[] với các bước như sau:

  1. Gán giá trị biến temp1 = 15 và temp2 = 20.
  2. Kiểm tra điều kiện bên trong while: Vì 15 != 20 nên sẽ thực thi lệnh bên trong while. Lúc này 15 < 20 nên lệnh bên trong else sẽ được thực thi và lúc này biến temp2 = 5.
  3. Quay lại bước 3, kiểm tra điều kiện bên trong while: Vì 15 != 5 nên sẽ thực thi lệnh bên trong while. Lúc này 15 > 5 nên lệnh bên trong if sẽ được thực thi và lúc này biến temp1 = 10.
  4. Quay lại bước 3, kiểm tra điều kiện bên trong while: Vì 10 != 5 nên sẽ thực thi lệnh bên trong while. Lúc này 10 > 5 nên lệnh bên trong if sẽ được thực thi và lúc này biến temp1 = 5.
  5. Quay lại bước 3, kiểm tra điều kiện bên trong while: Vì 5 == 5 nên sẽ không thực thi lệnh bên trong while. Vòng lặp kết thúc, trả về giá trị uscln = 5.

Chủ Đề