@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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект