Edit: я новичок в C ++, и я хотел бы больше узнать о том, как оптимизировать мой код.
Я создал объект Fraction в C ++, а также перегруженные операции +, -и т.д. Когда я пришел к унарным операторам, я понял, что не знаю, как уменьшить дробь наиболее эффективным способом.Итак, у меня есть функция gcd, которая находит наибольший делитель:
int gcd (int n, int m) {
int newN = n < 0 ? -n : n;
int newM = m < 0 ? -m : m;
if (newM <= newN && newN % newM == 0) { return newM; }
else if (newN < newM) { return gcd(newM, newN); }
else { return gcd(newM, newN%newM); }
}
, а затем у меня есть перегруженный оператор, например, увеличение:
Fraction& Fraction::operator++() {
num = num + denom;
//reduce fraction
int divisor = gcd(denom,num);
num = num/divisor;
denom = denom/divisor;
if (num < 0 && denom < 0) {num *= (-1);}
if (denom < 0) {denom *= (-1);}
return *this;
}
Для эффективности я бы хотелпоместите часть кода reduce fraction
в отдельную вспомогательную функцию single , чтобы конечная функция выглядела следующим образом:
Fraction& Fraction::operator++() {
num = num + denom;
//reduce fraction
reduce(num, denom);
return *this;
}
Таким образом, мне не нужно копировать и вставлятьчто бы ни было в //reduce fraction
каждый раз, когда я перегружаю унарный оператор, например.Однако я не уверен, как должна выглядеть функция Reduction (Fraction num, Fraction & denom).Самое большее, я могу реализовать это следующим образом:
void reduce(int& num, int& denom) {
int divisor = gcd(denom,num);
num = num/divisor;
denom = denom/divisor;
if (num < 0 && denom < 0) {num *= (-1);}
if (denom < 0) {denom *= (-1);}
}
Я уверен, что приведенный выше код может столкнуться с проблемами во время компиляции, поэтому мне было интересно, можно ли мне предложить какие-либо указатели для эффективного создания дробной частифункция.Возможно, это немного придирчиво, поскольку мой оригинальный код работает нормально, но, поскольку я новичок в C ++, я хотел бы узнать больше о том, как я могу сделать свой код более эффективным.Большое спасибо!Дайте мне знать, если потребуется дополнительная информация.
Редактировать: вышеуказанный код не работает.Компилируется правильно, но не уменьшает дробь должным образом.Таким образом, 1/2 + 1/4 приводит к 6/8, а не к 3/4.