< Zpět na seznam úloh

P8 Dělitelná trojice

var datasets = [
{argv: [1,2,3], out: [1,1,3]},
{argv: [4,8,30], out: [4, 8, 32]},
{argv: [237,434,639], out: [160, 320, 640]},
{argv: [244,912,1220], out: [244, 976, 976]},
{argv: [2876,5740,8462], out: [2116, 4232, 8464]},
{argv: [5244,6577,8227], out: [1,2,2]},
]
var names = ['a', 'b', 'c'];

Dostáváme tři přirozená čísla 0 < a < b < c < 1 000 000.

Našim úkolem je najít trojici čísel x, y, z takových, že x je dělitelem y a to je dělitelem z. Konkrétně, máme najít nejbližší takovou trojici. To znamená, součet abs(a - x) + abs(b - y) + abs(c - z) má být co nejmenší.

m = 10
def main(a, b, c):
  best = 3*m
  result = None
  for i in range(1,m):
    for j in range(i, m):
      for k in range(j, m):
        if j % i == 0 and k % j == 0:
          value = abs(a-i) + abs(b-j) + abs(c-k)
          if value < best:
            best = value
            result = i, j, k
  return result

Rada: projít cyklem čísla do milionu je reálné, ale udělat takové tři cykly v sobě už je spíš surreálné. Bude to chtít nějaký zlepšovák.

Druhá rada: myslím, že žádná velká matematická chytrost se na tohle aplikovat nedá.