Problem z zadaniem z NWD

0

Mam zadanie, aby wyznaczyć największy wspólny dzielnik wszystkich liczb z tablicy tab (funkcja typu int), wiedząc, że NWD(a, b, c) = NWD( a, NWD(b, c)). Wczytywanie do tablicy musi być w funkcji void. Nie rozumiem, dlaczego program nie zwraca wyniku. Czy mógłby mi ktoś pomóc i napisać, co robię niepoprawnie?

#include <iostream>
#include <cstdlib>
#include <ctime>
#define MAX  100
using namespace std;
int tab[MAX];

void wczytanie(int n){
srand(time(NULL));
for(int i = 0; i < n; i++){
    tab[i] = rand() % 1001;
    //cout<<tab[i]<<endl;
}
}

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

int NWDtablica(int n){
    wczytanie(n);
    int c = tab[0];
    for(int i = 0; i < n; i++)
        c = NWD(c, tab[i]);
    return c;
}

/*int SumaTablicy(int n){
    wczytanie(n);
    int suma = 0;
for (int i = 0; i < n; i++)
    suma = suma + tab[i];
    return suma;
}*/

int main()
{
    int n;
    cout << "Podaj n: ";
    cin>>n;
    wczytanie(n);
    NWDtablica(n);
    //cout<<tab[0];
    //SumaTablicy(n);
    return 0;
}
0
Boxwood napisał(a):

NWD(a, b, c) = NWD( a, NWD(b, c))

Możesz użyć rekurencji.

void wczytanie(int n){
srand(time(NULL));
for(int i = 0; i < n; i++){
    tab[i] = rand() % 1001;
    //cout<<tab[i]<<endl;
}
}

Zero raczej nie jest dopuszczalne w tym algorytmie, więc raczej:

tab[i] = rand() % 1000 + 1;
int NWD(int a, int b){
    int nwd;
    while (b != 0){
        nwd = a % b;
        a = b;
        b = nwd;
}
return a;
}

Tę funkcję możesz zamienić na rekurencyjną, coś w rodzaju:

int NWD(int tab[], int n){
    int a = tab[0];
    b = n > 2 ? NWD( &tab[1], n - 1 ) : tab[1];
    // ...
}
1

Nie rozumiem, dlaczego program nie zwraca wyniku.

Hmm, a która część Twojego programu odpowiada za wypisanie wyniku?

0

Zamiast return c zrobiłem cout<<c i działa. Nie rozumiem jednak dlaczego

3

return c; powoduje jedynie zwrócenie wartości z funkcji, a nie wypisanie jej na standardowe wyjście - zauważ, że chyba nie chciałbyś, aby np. return a; wewątrz NWD() automatycznie wyrzucało każdą wyliczoną liczbę do konsoli, prawda? :-)

Alternatywnie możesz zostawić return c; i zrobić:

cout << NWDtablica(n);

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