Логика назначения ссылочной переменной

#c #pass-by-reference

#c #передача по ссылке

Вопрос:

Хорошо, итак, я создаю функцию, которая уменьшает рациональное число путем вычисления наибольшего общего множителя, а затем возвращает новый числитель и знаменатель после уменьшения / упрощения. Пример: от 24/60 до 2/5.

 void reduce(int amp;num, int amp;den){
  int remainder = num % den;

  while(remainder!=0){
    num = den;
    den = remainder;
    remainder = num % den;
    cout << "gcf: " << remainder << endl;
    break;
  }
    num = num / remainder;
    den = den / remainder;
  
}

  

Функция должна возвращать num = 2 и den = 5. Однако по какой-то причине он возвращает num = 5 и den = 2.

Моя основная функция выглядит следующим образом

 int main() {
    int num = 24;
    int den = 60;
    reduce(num, den);
    cout << num << " " << den;
    // Output: 
    // gcf: 12
    // 5 2
  

Комментарии:

1. Почему бы не использовать std::gcd ?

2. Неохраняемый break оператор в цикле приводит к очень короткому времени, затрачиваемому на цикл.

3. @eerorika Я мог бы, но теоретически, как бы я это сделал таким образом (что я делаю неправильно)

Ответ №1:

Вы меняете num и den внутри while цикла. Это значение не должно быть изменено.

Пожалуйста, сохраните num den переменные и внутри другой переменной и выполните операцию с использованием этих значений следующим образом.

 void reduce(int amp;num, int amp;den){
  int remainder = num % den;

  int tempNum = num, tempDen = den;
  while(remainder != 0){
    tempNum = tempDen;
    tempDen = remainder;
    remainder = tempNum % tempDen;
    cout << "gcf: " << remainder << endl;
    break;
  }
  num = num / remainder;
  den = den / remainder;
}

int main() {
    int num =24;
    int den = 60;
    reduce(num,den);
    cout << num << " " << den;
    return 0;
}
  

Комментарии:

1. Вы можете даже извлечь цикл в его собственную функцию gcd (которую вы можете заменить, std::gcd если она доступна (C 17) и разрешена).