#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) и разрешена).