Я вижу, что вы уже приняли ответ, но я все равно буду звонить.
Метод грубой силы не должен проверять каждый знаменатель.Если вы работаете в обратном направлении, вы можете исключить не только число, которое вы только что проверили, но и каждый его фактор.Например, после того как вы проверили 9999, вам не нужно проверять 3333, 1111, 909, 303, 101, 99, 33, 11, 9, 3 или 1;если число может быть выражено как дробь одного из них, оно также может быть выражено как дробь 9999. Оказывается, что каждое число до 5000 является фактором, по меньшей мере, одного числа от 5000 до 9999, поэтому вы сократилиВаше пространство поиска пополам.
Редактировать: Я нашел эту проблему достаточно интересной, чтобы кодировать решение на Python.
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
def simplify(fraction_tuple):
divisor = gcd(fraction_tuple[0], fraction_tuple[1])
return fraction_tuple[0] / divisor, fraction_tuple[1] / divisor
def closest_fraction(value, max_denominator=9999, tolerance=1e-12, enforce_tolerance=False):
best_error, best_result = abs(value), (0,1)
for denominator in range(max_denominator/2+1, max_denominator+1):
numerator = round(value * denominator)
error = abs(value - (numerator / denominator))
if error < best_error:
best_error = error
best_result = int(numerator), denominator
if error <= tolerance:
break
if enforce_tolerance and best_error > tolerance:
return None
return simplify(best_result)