Код, который при добавлении оператора if ломается

Есть код, который при добавлении оператора if ломается.

Есть функция, которая возвращает наибольший общий делитель(НОД) двух данных чисел «licz1» и «licz2» Функция работает правильно (многократно проверял) Ее пример:

int NWD(int licz1, int licz2)
{
  int n;
  if(licz1 > licz2)
  {
    while(n != 0)
    {
      n = licz1 % licz2;
      licz1 = licz2;
      licz2 = n;
    }
    return licz1;
  }
  else
  {
    while(n != 0)
    {
      n = licz2 % licz1;
      licz2 = licz1;
      licz1 = n;
    }
    return licz2;
  }
}

И есть тело программы, которое в данном виде выдает ожидаемый результат:

int main()
{
  int arrOne[7] = {3,7,4,6,10,2,5};
  int a;
  for(int i=0; i<6; i++)
  {
    a = NWD(arrOne[i], arrOne[i+1]);
    cout << a << endl;
  }
  return 0;
}

Этот код вернет нам следующие значения:

1, 2, 2, 2, 1

Но! Если я хочу вернуть НОД значение которого больше чем 1. Например:

int main()
{
  int arrOne[7] = {3,7,4,6,10,2,5}; // 0-6
  int a;
  for(int i=0; i<6; i++)
  {
    a = NWD(arrOne[i], arrOne[i+1]);
    if(a > 1)
    {
      cout << a << endl;
    }
  }
  return 0;
}

Все идет наперекосяк. И я получаю вместо:

2, 2, 2

Вот это:

7, 6, 2, 2 или же 7, 2, 2, 2 - значения различаются в зависимости от компилятора

Почему так происходит? Что я делаю не так?


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

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

Смотрите - вот такой перекосяк имеет место:

int n;
if(licz1 > licz2)
{
    while(n != 0)
    {

Переменная n неинициализирована, так что в ней может быть что угодно. В том числе 0, и цикл сорвется - и вы получите неверное значение!

Инициализируйте ее чем-то ненулевым. Типа int n = 1;.

О том, что нет смысла писать НОД с такими дублированиями кода, промолчу.

Лично я написал бы примерно так:

int NWD(int licz1, int licz2)
{
    while(licz1 && licz2)
        if (licz1 < licz2) licz2 %= licz1; else licz1 %= licz2;
        return licz1 + licz2;
}
→ Ссылка