def josephus1(ls, skip):
skip -= 1
idx = skip
while len(ls) > 1:
if idx+1 > len(ls):
idx %= len(ls)
print(ls.pop(idx),"выбывает")
idx = (idx + skip) % len(ls)
print(idx,"Это IDX")
print('survivor: ', ls[0])
def josephus2(ls, skip):
skip -= 1
dead_num = 0
while len(ls) > 1:
dead_num = (dead_num+skip) % len(ls)
print(ls.pop(dead_num),"выбывает")
print('survivor: ', ls[0])
n = int(input('Введите количество человек:'))
m = int(input('Сколько человек посчитать?:'))
list_people = [i for i in range(1, n + 1)]
print(list_people)
josephus(list_people, m)
Даны натуральные n, m. Предполагается, что n человек встают в круг и получают номера, считая против часовой стрелки, 1, 2, ..., n. Затем, начиная c первого, также против часовой стрелки отсчитывается m-й человек (поскольку люди стоят по кругу, то за n-м человеком стоит первый ). Этот человек выходит из круга, после чего, начиная со следующего, снова отсчитывается m-й человек и так до тех пор, пока из всего круга не останется один человек. Определить его номер.
Задачу решил, в интернете искал, нашёл первые два алгоритма - josephus1 и 2. Можно ли ещё каким-либо способом решить более удобно или эти лучше? Я просто долго разбирался в этом, но лучше не придумал. Думал через счётчик сделать, чтобы каждое m значение удалялось, но не вышло, там не те числа удалялись и я забил и удалил.
И ещё - как алгоритм адаптировать под разное количество человек, которых считаешь? То есть сначала 5, потом 3, потом 7, ну вы поняли. Заранее спасибо