Największy wspólny dzielnik - błędny kod

0

Coś mi nie działa. Mam do napisania program szukający NWD spośród dwóch liczb. Metoda, jaką ma się posługiwać, wygląda następująco:

Dana liczba a (np. 54) i b (np. 18)

Dla a, rozkład na czynniki będące liczbami pierwszymi:

54/2 = 27
27/3 = 9
9/3 = 3
3/3 = 1

Dla b, rozkład na czynniki będące liczbami pierwszymi:

18/2 = 9
9/3 = 3
3/3 = 1

Powtarzającymi się elementami rozkładu obu liczb są: 2, 3, 3
233 = 18, co daje nam NWD.

Oto kod:

#include <iostream>

using namespace std;

int mniejsza (int x, int y)
{
    if (x>y)
        return y;
    else
        return x;
}

int pierwsza (int n)
{
    int s;

        for (int k= 1; k<=n; k++)
        {
            if (n%k == 0)
            {
                s++;
            }
        }
    if (s == 2)

        return true;
    else
        return false;

}

int nwd (int a, int b)
{
    int x = 0, y = 0, c, i, tabla[100], tablb[100];

    while (a>1)
    {
        c = a;
        i = 2;

        while (c == a)
        {

            if (a%pierwsza(i)==0)
            {
                a = a/pierwsza(i);
                tabla[x] = pierwsza(i);
                x++;
            }

            i++;
        }
    }


    while (b>1)
        {
            c = b;
            i = 2;

            while (c == b)
            {

                if (b%pierwsza(i)==0)
                {
                    b = b/pierwsza(i);
                    tablb[y] = pierwsza(i);
                    y++;
                }

                i++;
            }
        }

    int T1[100], T2[100];

    for (int d = 0; d<x; d++)
    {
        T1[tabla[d]]++;
    }

    for (int e = 0; e<y; e++)
    {
        T2[tablb[e]]++;
    }

    int f = 0;

    for (int g = 1; g<a+b-mniejsza(a, b); g++)
    {
        f = f + mniejsza(T1[g], T2[g]) * g;
    }

    return f;

}

int main() {

    int a, b;

    cin >> a >> b;

    cout << nwd (a, b);

    return 0;
}

Bardzo proszę o pomoc, co tu nie działa? Mógłbym prosić o poprawioną wersję programu? Z góry dziekuję :)

0
a = a/pierwsza(i);

To nie jest dzielenie przez 0?

int mniejsza (int x, int y)
{
    if (x>y)
        return y;
    else
        return x;
}
<s> Tego typu funkcje lepiej robić w ten sposób:
int mniejsza (int x, int y)
{
    return (x>y);
}
</s> ```cpp if (s == 2) return true; else return false; ``` Lepiej dać:
    return s==2;

Jaki jest problem? Kod wiesza się? Wywala właśnie błąd z dzieleniem przez 0? Zwraca błędny wynik?

usunięcie zbędnych pustych linii z kodów - fp

0

Tak, wiesza się, wpisuję dane, czekam moment i pojawia się błąd treści "program przestał działać".

Rzeczywiście, to było dzielenie przez zero, zamiast w funkcji "pierwsza" zwracać "n" jak tu:

int pierwsza (int n)
{
    int s;
 
        for (int k= 1; k<=n; k++)
        {
            if (n%k == 0)
            {
                s++;
            }
        }
    if (s == 2)
 
        return n;
    else
        return (jakaś inna liczba która nigdy nie da reszty zero w dzieleniu a%pierwsza(i) i która nie jest zerem);
 
}

Ja zwracałem true. Ale nadal nie działa :(

dodanie znaczników <code class="cpp"> - fp

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