@samsungovetch

Как решить задачу Иосифа?

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, ну вы поняли. Заранее спасибо
  • Вопрос задан
  • 140 просмотров
Пригласить эксперта
Ответы на вопрос 1
@mentor2
См. Грехэм, Кнут, Паташник "Конкретная математика", Мир 2006, стр 25
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы