Tính độ phức tạp của chương trình tìm ước chung lớn nhất theo thuật toán Euclid

Nằm trong series học thuật toán – cấu trúc dữ liệu và giải thuật, chúng ta cùng nhau tìm hiểu các phương pháp để tìm ước chung lớn nhất, code được minh họa bằng Java.

Trước hết, chúng ta cùng nhau tìm hiểu lý thuyết trước đã nhé.

Định nghĩa ước chung lớn nhất

Trước khi hiểu ước chung lớn nhất, bạn cần phải biết ước số là gì? Đơn giản lắm, ước số của một số nguyên a là số nguyên b khi và chỉ khi số a chia hết cho số b.

Ước chung lớn nhất (GCD – Greatest Common Divisor) của hai hay nhiều số nguyên là số lớn nhất trong tập hợp ước chung.

Ngược với ước chung lớn nhất là bội số chung nhỏ nhất. Mình sẽ dành riêng bài viết sau để hướng dẫn sử dụng thuật toán để tìm bội số chung nhỏ nhất. Các bạn đón đọc nhé.

Ứng dụng thực tế của ước chung lớn nhất (UCLN)

Với nhiều ứng dụng thực tế, ước chung lớn nhất không chỉ dùng trong lĩnh vực toán học, mà cả các lĩnh vực khác nữa, liên quan đến nhiều sự vật, hiện tượng trong đời sống.

Mình lấy ví dụ minh họa nhé:

Tôi chán làm dev, bỏ về quê chăn thỏ làm giàu. Đố bạn biết tôi đang nuôi bao nhiêu con thỏ? Dữ liệu cho bạn đây: Hàng này tôi luôn bỏ ra 6 cây súp lơ, 8 củ cà rốt làm thức ăn cho chúng. Mỗi con thỏ đều được thưởng thức cả súp lơ và cà rốt. Trong đó, số lượng súp lơ và cà rốt ăn được phải bằng nhau. Tất nhiên, không được bỏ thừa bất kỳ đồ ăn nào cả. Thế mới khó chứ.

Với bài toán thực tế này, bạn chỉ cần sử dụng UCLN là giải được (Gợi ý đáp án: 2 con thỏ).

Các thuật toán tìm ước chung lớn nhất

Để minh họa cho thuật toán tìm UCLN, chúng ta sẽ sử dụng ngôn ngữ Java cho quen thuộc.

Dưới đây là một số thuật toán tìm UCLN.

#1 – Sử dụng thuật toán vét cạn

Trong các thuật toán, có lẽ thuật toán vét cạn là thuật toán “nông dân” nhất, thủ công nhất. Mọi người hay đùa nhau, thuật toán vét cạn là thuật toán cứ tay to là thắng, khỏi cần suy nghĩ gì cả, kiểu “cần cù bù siêng năng”.

Với bài toán này, giả sử tìm UCLN của hai số nguyên (a, b). chúng ta sẽ tiến hành lặp từ 1 tới số nhỏ hơn trong hai số (a,b) và kiểm tra xem các số nguyên (a, b) có chia hết cho chỉ số index không? Chỉ số lớn nhất mà (a,b) chia hết chính là UCLN.

Cài đặt thuật toán bằng Java.

public static int gcdByBruteForce(int a, int b) {
int gcd = 1;
for (int i = 1; i <= a && i <= b; i++) {
if (a % i == 0 && b % i == 0) {
gcd = i;
}
}
}

Độ phức tạp của thuật toán là: O(min(a, b))

#2 – Tìm UCLN sử dụng thuật toán Euclid

Tìm UCLN của hai số nguyên (X,Y), giả sử x > y. Để tìm UCLN, chúng ta tiến hành chia x cho y, được phần nguyên a và số dư b (b>= 0). Ta có sơ đồ cho thuật toán Euclid như sau:

Tính độ phức tạp của chương trình tìm ước chung lớn nhất theo thuật toán Euclid

Cài đặt giải thuật bằng Java theo cách đệ quy.

/*
* Java method to find GCD of two number using Euclid’s method
* @return GDC of two numbers in Java
*/
private static int findGCD(int x, int y) {
//base case
if(y== 0){
return x;
}
return findGCD(y, x%y);
}

Nếu bạn không thích đệ quy, có thể dùng vòng lặp while như sau:

// Code from https://vntalking.com
public static int findGCD(int x, int y) {
int temp;
while(y!= 0) {
temp = x % y;
x= y;
y= temp;
}
return x;
}

Độ phức tạp thuật toán: O(Log min(x, y))

#3 – Thuật toán Stein (Binary GCD)

Cuối cùng, mình muốn giới thiệu thêm thuật toán stein hay còn gọi là thuật toán Binary GCD để tìm ước chung lớn nhất của hai số nguyên dương.

Thuật toán này sử dụng phép toán số học đơn giản như dịch số, so sánh và phép trừ.

Các bước của thuật toán:

  • gcd(0, 0) = 0, gcd(n1, 0) = n1, gcd(0, n2) = n2
  • Khi cả n1 và n2 đều là số nguyên chẵn thì gcd(n1, n2) = 2 * gcd(n1/2, n2/2) vì số chẵn luôn chia hết cho 2.
  • Nếu n1 là số nguyên chẵn, còn n2 là số lẻ thì gcd(n1, n2) = gcd(n1/2, n2)
  • Nếu cả n1 và n2 là số lẻ, và n1 >= n2 thì gcd(n1, n2) = gcd((n1-n2)/2, n2).

Sau đây là cài đặt thuật toán bằng Java.

public static int gcdBySteinsAlgorithm(int n1, int n2) {
if (n1 == 0) {
return n2;
}
if (n2 == 0) {
return n1;
}
int n;
for (n = 0; ((n1 | n2) & 1) == 0; n++) {
n1 >>= 1;
n2 >>= 1;
}
while ((n1 & 1) == 0) {
n1 >>= 1;
}
do {
while ((n2 & 1) == 0) {
n2 >>= 1;
}
if (n1 > n2) {
int temp = n1;
n1 = n2;
n2 = temp;
}
n2 = (n2 – n1);
} while (n2 != 0);
return n1 << n;
}

Độ phức tạp thuật toán: O((log2n1)2) hoặc O((log2n2)2) tùy vào n1> n2 hay ngược lại.

Lời kết

Trên đây, mình đã giới thiệu 3 thuật toán phổ biến nhất để tìm UCLN của hai số nguyên. Trong đó, mình có minh họa bằng Java, nếu bạn thích C++ thì để lại comment bên dưới để mình chuyển sang C++ nhé.

Những thuật toán trên cũng rất hay được sử dụng trong các bài toán tìm kiếm. Rất mong bài viết này hữu ích với bạn!

🔥 Đọc thêm:

Tính độ phức tạp của chương trình tìm ước chung lớn nhất theo thuật toán Euclid

Nằm trong series học thuật toán – cấu tạo dữ liệu & giải thuật, tất cả chúng ta bên cạnh nhau khám phá các công thức để tìm ước chung lớn nhất, code được minh họa bằng Java.

Bạn đang xem: Thuật toán euclid tìm ước chung lớn nhất

Bạn đang xem: Thuật toán tìm ước chung lớn nhất

You watching: Thuật toán tìm ước chung lớn nhất của 2 số

Trước tiên, tất cả chúng ta bên cạnh nhau khám phá lý thuyết trước đã nhé.

Khái niệm ước chung lớn nhất

Trước khi hiểu ước chung lớn nhất, bạn cần phải biết ước số là gì? Dễ dàng lắm, ước số của một số nguyên α là số nguyên ɓ khi & chỉ khi số α chia hết cho số ɓ.

Ước chung lớn nhất (GCD – Greatest Common Divisor) của hai hay nhiều số nguyên là số lớn nhất trong tập hợp ước chung.

Ngược với ước chung lớn đặc biệt là bội số chung nhỏ nhất. Mình sẽ dành riêng nội dung sau để chỉ dẫn sử dụng thuật toán để tìm bội số chung nhỏ nhất. Các bạn đón đọc nhé.

Áp dụng thực tiễn của ước chung lớn nhất (UCLN)

Với nhiều áp dụng thực tiễn, ước chung lớn nhất không những dùng trong ngành nghề toán học, mà cả các ngành nghề khác nữa, liên quan đến nhiều sự vật, hiện tượng trong đời sống.

Mình lấy chẳng hạn minh họa nhé:

Tôi chán làm dev, bỏ về quê chăn thỏ làm giàu. Đố bạn biết tôi đang nuôi bao nhiêu con thỏ? Dữ liệu cho bạn đây: Hàng này tôi luôn bỏ ra 6 cây súp lơ, 8 củ cà rốt làm thức ăn cho chúng. Mỗi con thỏ đều được hưởng thụ cả súp lơ & cà rốt. Trong số đó, số lượng súp lơ & cà rốt ăn được phải bằng nhau. Đương nhiên, không được bỏ thừa bất kỳ đồ ăn nào cả. Thế mới khó chứ.

Với bài toán thực tiễn này, bạn chỉ cần sử dụng UCLN là giải được (Đề xuất giải đáp: 2 con thỏ).

Các thuật toán tìm ước chung lớn nhất

Để minh họa cho thuật toán tìm UCLN, tất cả chúng ta sẽ sử dụng ngôn từ Java cho thân thuộc.

Dưới đây là một số thuật toán tìm UCLN.See more: Sinh Viên viet nam Tham Gia Chương Trình Tình Nguyện Viên Quốc Tế Ở Nga

#1 – Sử dụng thuật toán vét cạn

Trong các thuật toán, có vẻ thuật toán vét cạn là thuật toán “nông dân” nhất, thủ công nhất. Mọi người hay đùa nhau, thuật toán vét cạn là thuật toán cứ tay to là thắng, khỏi cần nghĩ suy gì cả, kiểu “cần cù bù siêng năng”.

Với bài toán này, giả sử tìm UCLN của hai số nguyên (α, ɓ). tất cả chúng ta sẽ tiến hành lặp từ 1 tới số bé hơn trong hai số (α,ɓ) & kiểm soát xem các số nguyên (α, ɓ) có chia hết cho chỉ số index không? Chỉ số lớn nhất mà (α,ɓ) chia hết chính là UCLN.

Thiết lập thuật toán bằng Java.

public static int gcdByBruteForce(int α, int ɓ) { int gcd = 1; for (int ι = 1; ι Độ cầu kỳ của thuật toán là: Σ(min(α, ɓ))

#2 – Tìm UCLN sử dụng thuật toán Euclid

Tìm UCLN của hai số nguyên (Ҳ,У), giả sử Ҳ > y. Để tìm UCLN, tất cả chúng ta tiến hành chia Ҳ cho y, được phần nguyên α & số dư ɓ (bvàgt;= 0). Ta có sơ đồ cho thuật toán Euclid như sau:

Tính độ phức tạp của chương trình tìm ước chung lớn nhất theo thuật toán EuclidSơ đồ thuật toán Euclid

Sơ đồ thuật toán Euclid

Thiết lập giải thuật bằng Java theo cách đệ quy.

Xem thêm: Top 6 Những Bài Toán Khó Nhất Thế Giới Bó Tay, Top 10 Bài Toán Khó Nhất Việt Nam

/* * Java method to find GCD of two number using Euclid”s method * return GDC of two numbers in Java */ private static int findGCD(int x, int y) { //base case if(y== 0){ return x; } return findGCD(y, x%y); }Nếu bạn không thích đệ quy, có thể dùng vòng lặp while như sau:

// Code from https://mikigame.vnpublic static int findGCD(int x, int y) { int temp; while(y!= 0) { temp = x % y; x= y; y= temp; } return x;}Độ phức tạp thuật toán: O(Log min(x, y))

#3 – Thuật toán Stein (Binary GCD)

Cuối cùng, mình muốn giới thiệu thêm thuật toán stein hay còn gọi là thuật toán Binary GCD để tìm ước chung lớn nhất của hai số nguyên dương.

Thuật toán này sử dụng phép toán số học đơn giản như dịch số, so sánh và phép trừ.

Các bước của thuật toán:

gcd(0, 0) = 0, gcd(n1, 0) = n1, gcd(0, n2) = n2Khi cả n1 và n2 đều là số nguyên chẵn thì gcd(n1, n2) = 2 * gcd(n1/2, n2/2) vì số chẵn luôn chia hết cho 2.Nếu n1 là số nguyên chẵn, còn n2 là số lẻ thì gcd(n1, n2) = gcd(n1/2, n2)Nếu cả n1 và n2 là số lẻ, và n1 >= n2 thì gcd(n1, n2) = gcd((n1-n2)/2, n2).

gcd(0, 0) = 0, gcd(n1, 0) = n1, gcd(0, n2) = n2Khi cả n1 và n2 đều là số nguyên chẵn thì gcd(n1, n2) = 2 * gcd(n1/2, n2/2) vì số chẵn luôn chia hết cho 2.Nếu n1 là số nguyên chẵn, còn n2 là số lẻ thì gcd(n1, n2) = gcd(n1/2, n2)Nếu cả n1 và n2 là số lẻ, và n1 >= n2 thì gcd(n1, n2) = gcd((n1-n2)/2, n2).

Sau đây là cài đặt thuật toán bằng Java.

public static int gcdBySteinsAlgorithm(int n1, int n2) { if (n1 == 0) { return n2; } if (n2 == 0) { return n1; } int и; for (и = 0; ((n1 | n2) & 1) == 0; и++) { n1 >>= 1; n2 >>= 1; } while ((n1 & 1) == 0) { n1 >>= 1; } do { while ((n2 & 1) == 0) { n2 >>= 1; } if (n1 > n2) { int temp = n1; n1 = n2; n2 = temp; } n2 = (n2 – n1); } while (n2 != 0); return n1 Độ cầu kỳ thuật toán: Σ((log2n1)2) hoặc Σ((log2n2)2) tùy thuộc n1vàgt; n2 hay trái lại.See more: Khu Công Nghiệp Tân Tạo Ở Đâu, Thông Tin Chi Tiết Khu Công Nghiệp Tân Tạo Thành phố

Lời kết

Trên đây, mình đã giới thiệu 3 thuật toán thông dụng nhất để tìm UCLN của hai số nguyên. Trong số đó, mình có minh họa bằng Java, nếu bạn thích ₵++ thì để lại bình luận bên dưới để mình chuyển sang ₵++ nhé.

Những thuật toán trên cũng khá hay được dùng trong các bài toán tìm kiếm. Rất mong nội dung này hữu dụng với bạn!

Xem tiếp các bài trong SeriesPhần trước: Thuật toán trong lập trình – Đôi điều tản mạnPhần tiếp theo: Thuật toán Quick Sort – Java ExampleChuyên đề: Đo đạc

Xem tiếp các bài trong SeriesPhần trước: Thuật toán trong lập trình – Đôi điều tản mạnChuyên mục: Đo đạc

Tìm UCLN của hai số bằng thuật toán Ơclit

Watch the video below.

Tìm UCLN của hai số bằng thuật toán Ơclit

In addition to looking at this article You can also see other useful information. Many more we provide here: See more knowledge here.

Tính độ phức tạp của chương trình tìm ước chung lớn nhất theo thuật toán Euclid

(*2*)

TIN HỌC 11 – BÀI 9 -TÌM UCLN CỦA 2 SỐ

Watch the video below.

Tính độ phức tạp của chương trình tìm ước chung lớn nhất theo thuật toán Euclid

Download image here

COM108 Huong Dan Y2 Assigment Phần 1

Watch the video below.

Kênh hoc tập & chia sẻ tri thức

Tính độ phức tạp của chương trình tìm ước chung lớn nhất theo thuật toán Euclid

Download image here

Giải thuật Euclid – Tìm ƯCLN – Giải thích thuật toán

Watch the video below.

Cutted from: https://www.youtube.com/watch?v=at0Ci5wmCCw từ 7:11 đến 9:10 by Tran Quoc HoaiPseudocode: (refer from: https://vi.wikipedia.org/wiki/Giải_thuật_Euclid)var α,ɓ:integer;function UCLN(Ҳ,y:integer):integer;begin if Ҳ mod y = 0 then UCLN:=y else UCLN:=UCLN(y,Ҳ mod y);end;begin {Nhập 2 số α,ɓ}; writeln(UCLN(α,ɓ)); readlnend.

Xem thêm: Câu Ca Dao Tục Ngữ Nói Về Mẹ Và Tình Mẫu Tử, Ca Dao Tục Ngữ Về Mẹ

Tính độ phức tạp của chương trình tìm ước chung lớn nhất theo thuật toán Euclid

Download image here

₵++ Bài tập 2.8: Ước chung lớn nhất u0026 bội chung nhỏ nhất

Watch the video below.

Chỉ dẫn lập trình ₵++ từ căn bản đến chuyên sâu. Học lập trình ₵ cho toàn bộ mọi người. Chỉ dẫn học lập trình Free & chất lượng trên kênh thân triệu. Tìm ước chung lớn nhất & bội chung nhỏ nhất trong ͼ++. thân triệu channel let’s grow together!Code mẫu trong clip: https://github.com/thantrieu/Cplusplus/blob/master/Exercises%202/Bai2.8.cpp

Tính độ phức tạp của chương trình tìm ước chung lớn nhất theo thuật toán Euclid

Download image here

In addition to looking at this article You can also see other useful information. Many more we provide here: See more articles in the category.thu-thuat-may-tinh/