Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Информатика 9 класс Python

Нина Абакумова Ученик (182), открыт 4 недели назад
С клавиатуры вводятся числа, ввод завершается числом 0. Определить минимальное из введённых чисел Фибоначчи. Вывести "нет", если чисел Фибоначчи в последовательности нет
3 ответа
Папа Высший разум (149125) 4 недели назад
Если 0 входит в состав последовательности, то он всегда и будет минимальным числом Фиббоначчи. А иначе - такой код, временная сложность O(n log n), а по памяти O(log r), где n - количество чисел в последовательности, r - максимальное число последовательности:
 from bisect import bisect_left

fibs, m = [0, 1], None

while (x := int(input())):
i = -1
while x > fibs[-1]:
fibs.append(sum(fibs[-2:]))
else:
i = bisect_left(fibs, x)
if x == fibs[i]:
m = min(x, x if m is None else m)

print("нет" if m is None else str(m))

Числа Фиббоначчи вычисляются по мере ввода новых чисел последовательности, чтобы закрыть последний введённый элемент. Если последнее вычисленное число Фиббоначчи равно ему, то обновляется минимум. Если же последний введённый элемент - где-то в середине ранее найденного диапазона чисел Фиббоначчи, то ищем бинарным поиском подходящее число и обновляем минимум, если нашли.

Можно сделать и проверкой 5n + 4, 5n - 4 на полный квадрат (это признак числа Фиббоначчи), тогда не придётся хранить сами числа Фиббоначчи. Временная сложность будет зависеть от скорости вычисления квадратного корня и произведения, т.е. в Питоне будет на уровне O(n log¹⋅⁵⁸ n), а сложность по памяти станет константой (O(1)):
 from math import isqrt

def isfib(x):
s = x * x * 5
i, d = isqrt(s + 4), isqrt(s - 4)
return i * i == s + 4 or d * d == s - 4

print(min(filter(isfib, iter(lambda: int(input()), 0)), default="нет"))
Рустам Абдрашитов Мудрец (14307) 4 недели назад
На
 def is_fib(n): 
if n < 0: return False
a, b = 0, 1
while b <= n:
if b == n: return True
a, b = b, a + b
return False

min_fib = float('inf')
found = False

while (x := int(input())) != 0:
if is_fib(x):
found = True
min_fib = min(min_fib, x)

print(min_fib if found else "нет")
больше не чат гпт ???? Мыслитель (9093) 4 недели назад
f=[]
while(x:=int(input())):
if x>=0 and (lambda n: (5*n*n+4)**0.5%1==0 or (5*n*n-4)**0.5%1==0)(x):f+=x,
print(min(f)if f else'нет')
Похожие вопросы