Считайте, что массив [1, .. q]
Затем умножьте каждый элемент на заданную дробь f
затем проверьте ближайший элемент к p. Я думаю, что этот алгоритм будет выполняться в O (q). хорошо, вы можете улучшить алгоритм, чтобы проверить, что p или q меньше, а затем сделать то же самое
import math
def foo(f,p,q):
m=9999
for i in range(1,q+1):
reqp=round(f*i)
if( abs((float(reqp)/i) -f ) <m and reqp>0 and reqp <=p ):
m=abs(float(reqp)/i-f)
values = [reqp,i]
return values
print(foo(3.14,30,30))
OUTPUT
[22.0, 7]