Witam, zastanawiam się nad tym zadaniem i obmyśliłem taki algorytm:
1. sprawdzam, czy działka nie jest kwadratem:
-> jeżeli jest kwadratem to znajduje największy dzielnik liczby mniejszy od niej samej żeby jednak podzielić na jak największe części tą działkę.
->jeżeli nie jest kwadratem to rekurencyjnie liczę NWD
Akceptacji nie ma, w komentarzu jest że odpowiedź za wolna.
może ktoś zerknąć na kod ? ewentualnie podpowiedzieć czy coś źle zrozumiałem ? albo czy źle podchodzę do tego zadania ?
tu jest mój kod
https://ideone.com/gqYEvG69
Rekurencja !!! -- naprawde !!! -- really !!!
Rekurencja to chyba jedna z najwolniejszych metod . Każde odwołanie to wrzucenie na stos całej masy danych co jest kosztowne . Do tego może się zdarzyć że zabraknie prędzej pamięci niż znajdziesz rozwiązanie . NASA podobno zakazuje stosowania rekurencji w algorytmach które obsługuje sprzęt w kosmosie .
Nazwanie funkcji "rekurencja" to nie najlepszy pomysł - lepiej ją nazwać NWD lub GCD - od razu wiesz co ten kawałek kodu robi .
Ja to zadanie zrobiłem z użyciem SITA - generuje tablice w której dla indeksów liczb pierwszych wstawiam jeden a dla pozostałych najmniejszy dzielnik danej liczby ( indeksu ). Dla takiej metody tylko raz ustalasz która liczba jest pierwsza . Sprawdzenie na jakie kwadraty podzielić działkę to sprawdzenie jednej zmiennej z SITA .
@fulse dzięki za podpowiedź, rzeczywiście to nie ma sensu, bo dla kwadratu działa, ale po zrobieniu tej korekty dalej daje błędną odpowiedź…
in
1
6127 6127
out
557
@konradmal
Uwaga na liczby pierwsze oraz na szukanie dzielnika w taki sposób:
i = 2;
while( a % i != 0 )
i++;
Parę ciekawszych testów (wyniki różne od 1
) do kontroli
In
32
530 795
539 847
442 425
667 828
980 360
716 358
624 768
740 200
665 490
341 713
186 589
684 804
693 396
803 803
38 874
350 854
182 468
525 945
468 576
343 735
104 663
13 962
145 174
960 840
714 483
325 117
627 304
507 247
803 803
570 228
506 836
112 784
Mój out:
265
77
17
23
20
358
48
20
35
31
31
12
99
73
38
14
26
105
36
49
13
13
29
120
21
13
19
13
73
114
22
112