Đề bài: 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 Java 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.
File: BaiTap5.java
package vn.viettuts.baitap; import java.util.Scanner; /
- Chương trình tìm ước số chung lớn nhất [USCLN]
- và bội số cung nhỏ nhất [BSCNN] của 2 số a và b
- @author viettuts.vn
/
public class BaiTap5 {
private static Scanner scanner = new Scanner[System.in]; /*
- main
- @param args
*/ public static void main[String[] args] { System.out.print["Nhập số nguyên dương a = "]; int a = scanner.nextInt[]; System.out.print["Nhập số nguyên dương b = "]; int b = scanner.nextInt[]; // tính USCLN của a và b System.out.println["USCLN của " + a + " và " + b
- " là: " + USCLN[a, b]];
// tính BSCNN của a và b System.out.println["BSCNN của " + a + " và " + b
- " là: " + BSCNN[a, b]]; } /
- " là: " + USCLN[a, b]];
- 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 / public static int USCLN[int a, int 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 / public static int BSCNN[int a, int b] { return [a b] / USCLN[a, b]; } } Kết quả:
Nhập số nguyên dương a = 15 Nhập số nguyên dương b = 40 USCLN của 15 và 40 là: 5 BSCNN của 15 và 40 là: 120
2. Tìm USCLN và BSCNN của 2 số nguyên dương trong Java bằng cách khác
package vn.viettuts.baitap; import java.util.Scanner; /
- Chương trình tìm ước số chung lớn nhất [USCLN]
- và bội số cung nhỏ nhất [BSCNN] của 2 số a và b
- @author viettuts.vn
/
public class BaiTap5_2 {
private static Scanner scanner = new Scanner[System.in]; /*
- main
- @param args
*/ public static void main[String[] args] { System.out.print["Nhập số nguyên dương a = "]; int a = scanner.nextInt[]; System.out.print["Nhập số nguyên dương b = "]; int b = scanner.nextInt[]; // tính USCLN của a và b System.out.println["USCLN của " + a + " và " + b
- " là: " + USCLN[a, b]];
// tính BSCNN của a và b System.out.println["BSCNN của " + a + " và " + b
- " là: " + BSCNN[a, b]]; } /
- " là: " + USCLN[a, b]];
- 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 / public static int USCLN[int a, int b] { int temp1 = a; int temp2 = b; while [temp1 != temp2] { if [temp1 > temp2] { temp1 -= temp2; } else { temp2 -= temp1; } } int 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 / public static int BSCNN[int a, int b] { return [a b] / USCLN[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: