Код, который при добавлении оператора 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 шт):
Смотрите - вот такой перекосяк имеет место:
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;
}