• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

NWD gotowe, ale jak to dokładnie działa? [SPOJ]

Object Storage Arubacloud
+1 głos
467 wizyt
pytanie zadane 15 sierpnia 2016 w C i C++ przez Kosmaty205 Początkujący (340 p.)

Robiąc zadanie "NWD" z naszego polskiego SPOJ'a i męcząc się z nim długo, postanowiłem poszukać informacji o jego wykonaniu w Internecie. Znalazłem taką o to funkcję:

int nwd(int a, int b)
{
    if (b!=0) return nwd(b, a%b);
    return a;
}

Teraz pytanie... Jak ona dokładnie działa? Czy mógłby ktoś mi to łopatologicznie wytłumaczyć? Co dzieje się krok po kroku? Jak zmieniają się a i b?

 

Z góry dziękuję!

3 odpowiedzi

+2 głosów
odpowiedź 15 sierpnia 2016 przez adas94 Nałogowiec (29,200 p.)
wybrane 15 sierpnia 2016 przez Kosmaty205
 
Najlepsza
Przykład :

Nwd (14,6)

If(6!=0) return (nwd(6, 14%6-czyli 2))

Nwd (6,2)

If (2!=0) return(nwd(2, 6%2-czyli 0))

Nwd (2,0)

If (0!=0 – nieprawda ) return a; - czyli 2

 

Tak łopatologicznie. a%b to inaczej modulo czyli reszta z dzielenia a przez b. A cały ten kod to prosta rekurencja czyli funkcja wywołująca samą siebie, aż do zmiany warunku.
komentarz 15 sierpnia 2016 przez Kosmaty205 Początkujący (340 p.)
Serdecznie dziękuję.
Tak na szybko... Jeśli a=2, b=26, to:

nwd(2, 26)

if (26!=0) return nwd(26, 2/26=0.08)

Więc nwd(26, 0) czy nwd(26, 1)?

Bo jeśli nwd(26, 0), to wtedy if (0!=0) return a; czyli 26. Lecz wiemy, że to nieprawda... Jak to zaokrąglić?
1
komentarz 15 sierpnia 2016 przez adas94 Nałogowiec (29,200 p.)
2%26 to 2, a nie 0.08. Modulo to inaczej reszta z dzielenia, a, że 2 w 26 nie mieści się ani razu w 26 to wynik to 2. Po więcej szczegółów wygoogluj sobie modulo.
1
komentarz 15 sierpnia 2016 przez ZakosiliMiNeta Nałogowiec (30,870 p.)

Tam jest nadal modulo nie dzielenie !!

if (26!=0) return nwd(26, 2/26=0.08)
mod nie dziele 

+1 głos
odpowiedź 15 sierpnia 2016 przez Porcupine Nałogowiec (31,560 p.)

Jakąś godzinę temu jeden z użytkowników naszego forum zaprezentował swoją stronę, na której jedną z funkcjonalności jest właśnie liczenie NWD (krok po kroku) - http://www.kalkmat.pl/?cnt=NWD&m=nwd

Wydaje mi się jednak, że najlepiej zrobisz jeśli sam na kartce przeanalizujesz przebieg algorytmu, podstawiając jakieś przykładowe dane i dochodząc do wyniku, później możesz sprawdzić z pomocą powyższej aplikacji czy się nie pomyliłeś. 

Po za tym o samym algorytmie masz więcej informacji na przykład tutaj: https://pl.wikipedia.org/wiki/Największy_wspólny_dzielnik w sekcji "Za pomocą algorytmu Euklidesa".

Warto też żebyś pogooglał i poczytał o rekurencji samej w sobie.

komentarz 15 sierpnia 2016 przez Kosmaty205 Początkujący (340 p.)
Dziękuję! Właśnie próbuję na A4 sobie to rozpisać, ale nadal mi coś nie wychodzi, jeśli np. a%b=0.25
1
komentarz 15 sierpnia 2016 przez Porcupine Nałogowiec (31,560 p.)
Pokręciłeś coś ;) Z modulo nie dostaniesz ułamka np. 1 % 4 = 1 (a nie 0.25)

Dla wyjaśnienia: 1 % 4 = 1, ponieważ:

1 = 0 * 4 + 1 (czyli zero całości + jeden reszty), na tej samej zasadzie co:

5 % 4 = 1, bo:

5 = 1  * 4 + 1 (jedna całość i reszty jeden)

A operacja modulo odpowiada wyznaczeniu tej reszty.
1
komentarz 15 sierpnia 2016 przez manjaro Nałogowiec (37,390 p.)
To jest algorytm rekurencyjny. I jak nie rozumiesz rekurencji to odpuść sobie. Tak jak wyżej ktoś zaproponował poczytaj o algorytmie Euklidesa. To jest bardzo łatwy algorytm na pewno go zrozumiesz. https://pl.wikipedia.org/wiki/Algorytm_Euklidesa
0 głosów
odpowiedź 15 sierpnia 2016 przez Kosmaty205 Początkujący (340 p.)
Dziękuję wszystkim! Chwilowe zaćmienie mózgu, ale jest już to dla mnie jasne. Jeszcze raz dziękuję! :)

Podobne pytania

0 głosów
1 odpowiedź 248 wizyt
0 głosów
1 odpowiedź 264 wizyt
pytanie zadane 15 grudnia 2022 w SPOJ przez Pan_Blazej Nowicjusz (180 p.)
–1 głos
2 odpowiedzi 348 wizyt
pytanie zadane 11 listopada 2018 w C i C++ przez program naczelny Gaduła (3,320 p.)

92,539 zapytań

141,382 odpowiedzi

319,477 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...