С моей точки зрения, тривиальное решение неверно, если допустимы отрицательные числа:
Как насчет r1=1/3
и b=1/(-3)
, которые должны быть правильными рациональными числами.и, конечно, математически он считает, что: 1 / (- 3) <1/3 </p>
Однако предлагаемое решение дает 1*3 > 1*(-3)
, что приводит к неверному решению, которое 1/3 < 1/(-3)
.
Я только столкнулся с этой проблемой во время моего курса Scala :-) Тем не менее, у меня нет хорошего решения по этому вопросу.
Может быть, как это часто бывает, это помогает заглянуть в BOOST-библиотеку: там написано:
Операция сравнения с рациональной операцией выполняет две операции GCD двойного размера, два дополнительных сложения и уменьшения и три сравнения в худшем случае.(Операции GCD имеют двойной размер, потому что они выполняются по частям, а временные коэффициенты сохраняются и сравниваются, тогда как прямая функция GCD сохраняет и сравнивает только остатки.)
http://www.boost.org/doc/libs/1_55_0/libs/rational/rational.html
До сих пор у меня не было возможности исследовать этот код.
Приветствия, Феликс
Тем временем я изучал код Boost, и он делает то же самое, что описывает Либерийв своем ответе выше.https://stackoverflow.com/a/4288890/2682209 Так что это определенно «правильный» (но громоздкий) путь.