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

Problem z zadankiem ze SPOJ

Object Storage Arubacloud
0 głosów
162 wizyt
pytanie zadane 21 maja 2018 w SPOJ przez Scutis Nowicjusz (120 p.)
edycja 21 maja 2018 przez Scutis

Hej. Mam problem z pewnym zadaniem ze spoja: http://pl.spoj.com/problems/NWW/.

Za nic nie mogę znaleźć błędu w moim kodzie, dlatego proszę was o pomoc. Wynik nie zawsze się zgadza. 

#include <iostream>

using namespace std;


int main()
{
    int n;
    int liczby[100000];
    int najwieksza=0;
    int wspolny_dz;
    int mnoznik = 2;   

    cin >> n;
    for (int j = 0; j < n; j++)
    {
        cin >> liczby[j];
    }


    for (int j = 0; j < n; j++)
    {
        if (liczby[j] > najwieksza)
        {
            najwieksza = liczby[j];
        }
    }
    wspolny_dz = najwieksza;

        
    for (int j = 0; j < n; j++)
    {
        if ((wspolny_dz%liczby[j]) != 0)
        {
            wspolny_dz = najwieksza * mnoznik;
            mnoznik++;
            j = 0;
        }
            
    }
    cout << endl << endl;
    cout << wspolny_dz << endl;
}

Będę wdzięczny za naprowadzenie na błąd.

2 odpowiedzi

+1 głos
odpowiedź 21 maja 2018 przez NIMuser Stary wyjadacz (11,030 p.)

Nie jestem pewien, ale obstawiam, że wstawienie j = 0; w 37 linii może namieszać w programie. W C++ masz coś w rodzaju continue i break, może się przydadzą?

Poza tym robisz błąd robiąc tablicę "na zapas", to nie turbo pascal :)

 

komentarz 21 maja 2018 przez Scutis Nowicjusz (120 p.)
Faktycznie. Zrobiłem zmienną niezależną od j i wydaje mi się, że teraz działa. Dzięki wielkie. :D Choć trochę ciekawi mnie, dlaczego coś się psuje kiedy "j" jest zerowane.

 

Już próbowałem wcześniej zastosować break bo myślałem, że może pętla "for" ustala na samym początku, że zostanie zakończona jeśli warunek się nie spełni, a nie na końcu, ale to też nie pomogło.

Anyways, teraz śmiga. xd
komentarz 21 maja 2018 przez NIMuser Stary wyjadacz (11,030 p.)

Zobacz czy śmiga rzeczywiście, bo kolega Aisekai poniżej dał wiele dobrych rat.

+1 głos
odpowiedź 21 maja 2018 przez Aisekai Nałogowiec (42,190 p.)
edycja 21 maja 2018 przez Aisekai
Na szybko:

1. Z tego co widzę, źle zrozumiałeś wejście.

-Najpierw na wejściu dostajesz liczbę zestawów,

-potem na wejściu zostaje wprowadzone ile liczb ma dany zestaw,

-wprowadzony zostaje zestaw (każda liczba oddzielona spacją)

-Krok 2 i 3 zostaje powtórzony tyle razy, ile wynosiła liczba co pojawiła się jako 1 na wejściu.

A ty masz tylko jedną iterację.

2.  Dalej, tworzenie na początku tablicy z 100000 komórkami to zły pomysł. Koncepcja na program powinna wyglądać tak:

- Pobierz pierwszą wartość z wejścia (n)

-Utwórz pętlę (for, while, do-while) która wykona się (n) razy.

-Utwórz dynamicznie tablicę (jeśli potrzebna) i zapisz w niej dane

-Wykonaj algorytm wyznaczania NWW dla wszystkich liczb

-Wypisz  wspólny dzielnik i znak nowej linii.

3. Wydaje mi się (na szybko), że ten algorytm wyznaczania NWW nie jest poprawny. Poczytaj o algorytmach do wyznaczania NWW 2 liczb. Dobrze napisany program, nie będzie wymagał dynamicznego alokowania danych wejściowych.

Edit: Do wyznaczenia NWW, można skorzystać z zależności, że NWW(a,b)*NWD(a,b)=a*b więc można łatwo zauważyć, że NWW(a,b) = (a*b)/NWD(a,b).

Może Ci się przydać wiedza, że NWD(a,b,c)=NWD(NWD(a,b),c)
komentarz 21 maja 2018 przez Scutis Nowicjusz (120 p.)
Dzięki za porady. Wiem, że wejście nie jest poprawne, powinienem to podkreślić przy tworzeniu tematu. Chciałem najpierw zająć się samym środkiem zadanka a potem dostosować je pod spoja. O algorytmach wyznaczania NWW poczytam, po prostu na początek chciałem samemu spróbować to rozwiązać.

Mój pomysł na to był taki, że najpierw znajduje największą liczbę spośród podanych i wstępnie zakładam, że wspólny dzielnik to ta największa liczba.

Następnie wszystkie podane liczby są dzielone przez ten dzielnik. Jeśli z któregoś z dzieleń reszta będzie inna od 0 to do dzielnika dodaję największą z liczb. I tak leci w kółko aż reszta z dzielenia przez każdą liczbę zawsze będzie równa 0.

Wydaje mi się, że nie ma tu błędu, choć mogę się mylić. Jeszcze raz dzięki za porady. :D
komentarz 22 maja 2018 przez Aisekai Nałogowiec (42,190 p.)
Aaa, ok. Nie zrozumiałem idei tego wcześniej, ale teraz jak to przedstawileś, to wygląda że dobry algorytm, może mniej optymalny niż standardowe znalezienie NWD, obliczenie iloczynu ab i podzielenie go przez nwd, ale jest ok.

Podobne pytania

0 głosów
0 odpowiedzi 673 wizyt
0 głosów
1 odpowiedź 454 wizyt
pytanie zadane 16 marca 2021 w Python przez darssska Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 340 wizyt

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 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!

...