в случае нахождения NOK выводит 0, что не так?


using namespace std;


int main() {
    
    long a, b, NOD, NOK;

    cout << "enter a: ";
    cin >> a;
    cout << "enter b: ";
    cin >> b;

    

    while (a != 0 && b != 0) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }


    NOD = a + b;

    NOK = (a * b) / NOD;
    

    cout << "NOD of numbers: " << NOD << endl;
    cout << "NOK of numbers: " << NOK << endl;


    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Да хотя бы потому, что из цикла вы выходите когда? Когда либо a, либо b становится равным 0. Т.е. a*b равно 0.

Все понятно?

Только вот так считать НОД (кстати, по-английски НОД и НОК — GCD и LCM) как минимум страшно неэффективно (не считая того, что эти функции уже есть в стандартной библиотеке)...

long gcd(T m, T n)
{
    while(m && n) if (m < n) n %= m; else m %= n;
    return m + n;
}

long lcm(T m, T n)
{
    return (m/gcd(m,n))*n;
}

Так куда эффективнее. И обратите внимание, что у меня НОК вычисляется как

(m/gcd(m,n))*n

в то время как у вас

(m*n)/gcd(m,n)

В чем разница и почему лучше так, как у меня — подумайте сами.

→ Ссылка