Как мне оптимизировать мой код, чтобы сделать мой жадный алгоритм лучше? - PullRequest
0 голосов
/ 12 июня 2019

Египетская дробь была записана как сумма дробных единиц, то есть числитель всегда равен 1; кроме того, никакие два знаменателя не могут быть одинаковыми. Самый простой способ создать египетскую дробь - многократно брать наибольшую подходящую дробную единицу, вычитать, чтобы найти то, что осталось, и повторять до тех пор, пока остаток не станет дробной, например:

  1. 7, деленное на 15, меньше 1/2, но больше 1/3, поэтому первая единица дробь 1/3, а первый остаток 2/15.
  2. Тогда 2/15 меньше 1/7, но больше 1/8, поэтому вторая единица дроби составляет 1/8, а второй остаток составляет 1/120.
  3. Это в виде единицы, поэтому мы закончили: 7 ÷ 15 = 1/3 + 1/8 + 1/120

Я пытаюсь решить проблему египетской дроби, где я использую жадный метод, приведенный ниже:

   def egyptianFraction(nr, dr): 

    print("The Egyptian Fraction " +
          "Representation of {0}/{1} is". 
                format(nr, dr), end="\n") 

    # empty list ef to store 
    # denominator 
    ef = [] 

    # while loop runs until  
    # fraction becomes 0 i.e, 
    # numerator becomes 0 
    while nr != 0: 

        # taking ceiling 
        x = math.ceil(dr / nr) 

        # storing value in ef list 
        ef.append(x) 

        # updating new nr and dr 
        nr = x * nr - dr 
        dr = dr * x 

    # printing the values 
    for i in range(len(ef)): 
        if i != len(ef) - 1: 
            print(" 1/{0} +" .  
                    format(ef[i]), end = " ") 
        else: 
            print(" 1/{0}" . 
                    format(ef[i]), end = " ") 

# calling the function 
egyptianFraction(6, 14) 

Мне нужно построить алгоритм, который гарантирует максимальное количество терминов или минимальный наибольший знаменатель; например,

5 ÷ 121 = 1/25 + 1/757 + 1/763309 + 1/873960180913 + 
1/1527612795642093418846225

but a simpler rendering of the same number is 
1/33 + 1/121 + 1/363.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...