Python, Задачка по бинарному поиску
Нужно вычислить загаданное число в заданном диапазоне. Не могу додуматься до алгоритма.
n = int(input('Введите начальное значение:'))
m = int(input('Введите конечное значение:'))
while (n != m - 2):
i = input(str(round(m/2))+'?>')
if (i == 'м'):
m = round((m+n/2)/2)
n = m * 2
continue
elif (i == 'б'):
m = round((n + m * 2)/2)
n = round(m / 2)
continue
else:
print('Введите "б/м"')
print('Задуманное число: '+str(n + 1))
Как правильно и наиболее оптимально его реализовать?
Ответы (2 шт):
Автор решения: GrAnd
→ Ссылка
Надо ещё добавить возможность ответить "да" на случай если число угадается раньше чем алгоритм доделится до конца.
n = int(input('Введите начальное значение: '))
m = int(input('Введите конечное значение: '))
i = None
while n != m and i != 'д':
if n > m:
print('Обманщик!')
break
v = (m - n) // 2 + n # вычисляем середину диапазона
i = input(f'{v} ? > ').lower()
if i == 'м':
m = v - 1 # если меньше - сдвигаем верхнюю границу
elif i == 'б':
n = v + 1 # если больше - сдвигаем нижнюю границу
elif i != 'д':
print('Введите "б/м/д"')
else:
print('Задуманное число:', v if i == 'д' else n)
Автор решения: n1tr0xs
→ Ссылка
Например так:
a = int(input())
b = int(input())
while True:
guess = (a+b) // 2
answer = input(f'{guess} ?:')
if answer == 'р':
print(f'Your number: {guess}') # мы угадали
break
elif a==b:
print('Stop deceiving me') # мы не угадали, но других чисел нет.
break
elif answer == 'м':
b = guess # загаданное число меньше - сдвигаем верх диапазона
elif answer == 'б':
a = guess # загаданное число больше - сдвигаем низ диапазона
else:
print('Введите равно(р) / больше(б) / меньше(м)')