Program który oblicza NWD nie działa poprawnie i zwraca głupoty

0

Witam program który napisałem zwraca głupoty nie wiem dlaczego . Proszę o pomoc. Wprowadzając dane 3 24 30 36 zwraca 2 a powinien 6.

#include <iostream>
using namespace std;

int NWD(int a, int b){
    int r = a % b;
    while(r != 0){
        a = b;
        b = r;
        r = a % b;
    }
    return b;
}
int NWD(int a[], int n){
    int dzielnik = NWD(a[0], a[1]);
    for (int i = 2; i <= n; i++)
        dzielnik = NWD(dzielnik, a[i]);
    return dzielnik;
}

int main() {
    int n;
    cin >> n;
    int liczba[n];
    for (int i = 0; i < n; i++)
        cin >> liczba[i];
    cout << NWD(liczba, n) << endl;
}
2
int n;
cin >> n;
int liczba[n];

Tak się nie tworzy dynamicznych tablic.

0

Tablica jest dbrze stworzona, bo tworzę tablicę która ma n elementów a potem przypisuje jej wartości. Wcześniej programy z tak zadeklarowaną tablicą działały bez zarzutu.

0

Dobra to już mniejsza z tym i tak mi to nie działa, nie wiem dlaczego.

0

To wcale nie oznacza, że tak się tworzy tablice i że będą działały zawsze. Rozmiar tablicy wbudowanej ma być constexpr, czyli stałą czasu kompilacji. Jeżeli chcesz ustawiać rozmiar w czasie wykonywania programu, użyj std::vector https://en.cppreference.com/w/cpp/container/vector
Opcjonalnie, jeżeli lubujesz w C++1410, new i delete, ale nie polecam.

int NWD(int a[], int n){
    int dzielnik = NWD(a[0], a[1]);
    for (int i = 2; i <= n; i++)
        dzielnik = NWD(dzielnik, a[i]);
    return dzielnik;
}

Dodatkowo, w powyższym kodzie, przy każdej iteracji pętli nadpisujesz zmienną dzielnik. Przypuszczam, że dzielnik += NWD(dzielnik, a[i]) załatwiłoby sprawę.

0

Dając dzielnik += NWD(dzielnik, a[i]) pogarszam sprawę i nie działa z przyczyn oczywistych bo jak mogę dodawać takie dzielniki jak mam np dane wejściowe 3 2 2 4??

3

powinno być i<n , wychodzisz poza zakres

0
Miang napisał(a):

powinno być i<n , wychodzisz poza zakres

Dzięki Wielkie za odpowiedź, teraz działa wszystko jak należy.

3
for (int i = 2; i <= n; i++)
        dzielnik = NWD(dzielnik, a[i]);

i bedzie rowne n i wtedy wychodzisz po za tablice (bo indeksujemy od zera wiec elementow w tablicy masz zawsze n-1. Wychodzisz po za zakres tablicy == UB

UB == program dziala... jak chce. Teoretycznie moga z niego smoki wyleciec z Twojego kodu

do poczytania czym jest UB
https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633

  1. nie rob tego na tablicy a na std::vector
  2. nie uzywaj zmiennych jednoliterowych a opisz konkretnie co robia
  3. Opisz sobie na kartce jak to ma dzialac (w punktach)
  4. kazdy punkt to bedzie osobna funkcja
  5. przepisz kod od zera
  6. ???
  7. profit bo bedzie dzialac
0

Hej,
tak dość szybko przejrzałem i raczej nie widzę błędu (poza wspomnianym), w algorytmie... no, ale tworzenie dwóch funkcji o tej samej nazwie, jest trochę podejrzane...

1 użytkowników online, w tym zalogowanych: 0, gości: 1