Najstarszy znany i stosowany dziś algorytm został opisany w starożytności perzez Euklidesa. Dotyczy wyznaczania największego wspólnego dzielnika NWD.
Algorytm Euklidesa wersja z odejmowaniem:
Procedura C++
int nwd(int a, int b){
while (a != b) {
if(a > b)
a = a - b;
else
b = b - a;
}
return a;
}
Algorytm Euklidesa wersja z resztą z dzielenia:
Procedura C++
int nwd(int a, int b){
while (b != 0) {
int pom = b;
b = a % b;
a = pom;
}
return a;
}
NWD odejmowanie | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||
NWD reszta z dzielenia | ||||||||||||||||
|
Wspólna wielokrotność liczb a i b to każda liczba naturalna, która dzieli się przez a oraz b.
Aby obliczyć NWW danej liczby należy:
56 = 2 ∗ 2 ∗ 2 ∗ 7
100 = 2 ∗ 2 ∗ 5 ∗ 5
Sprawdzamy, ile razy dany czynnik pierwszy został użyty w każdym z równań. Wybieramy największą wartość i tyle razy zapisujemy tę liczbę, czyli:
NWW(56,100) = 2 ∗ 2 ∗ 2 ∗ 5 ∗ 5 ∗ 7 = 1400
Algorytm wyznaczania NWW.
Nie istnieje algorytm na obliczanie NWW. Mimo to, dzięki występowaniu tej zależności:
Możemy skorzystać z algorytmu Euklidesa w celu znalezienia największego wspólnego dzielnika NWD (wybieramy resztę z dzielenia).
Mając NWD łatwo policzymy NWW.
Program C++
#include <iostream>
using namespace std;
int nwd(int a, int b){
while (b != 0) {
int pom = b;
b = a % b;
a = pom;
}
return a;
}
int nww(int a, int b) {
return a*b/nwd(a, b);
}
int main() {
int a = 56;
int b = 100;
cout << "największa wspólna wielokrotność: " << nww(a, b);
}