6 / 6 / 0
Регистрация: 18.10.2017
Сообщений: 51
1

Задача Иосифа Флавия

19.08.2018, 07:50. Показов 11637. Ответов 4

Author24 — интернет-сервис помощи студентам
Даны натуральные n, m. Предполагается, что n человек встают в круг и получают номера, считая против часовой стрелки, 1, 2, ..., n. Затем, начиная c первого, также против часовой стрелки отсчитывается m-й человек (поскольку люди стоят по кругу, то за n-м человеком стоит первый ). Этот человек выходит из круга, после чего, начиная со следующего, снова отсчитывается m-й человек и так до тех пор, пока из всего круга не останется один человек. Определить его номер.


Python
1
2
3
4
5
6
7
8
9
10
def josephus(ls, skip):
    skip -= 1 
    idx = skip
    while len(ls) > 1:
        print(ls.pop(idx),"выбывает") 
        idx = (idx + skip) % len(ls)
        print(idx,"Это IDX")
    print('survivor: ', ls[0])
 
josephus([1,2,3,4,5,6,7], 8)
То, что нашёл в интернете. Помогите разобраться со строкой
Python
1
idx = (idx + skip) % len(ls)
. По какому принципу она работает? Я понимаю, что это как бы остаток от деления. Сам делал похожее, но всё же отличающееся, просто плюсовал, и не находил остаток от деления. Мой код не работал.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n = int(input('Введите количество человек:'))
m = int(input('Сколько человек посчитать?:'))
 
list_people = [i for i in range(1, n + 1)]
print(list_people)
 
now_point = 0
while 1:
    del list_people[m-1+now_point]
    now_point += m-1
    if len(list_people) == 1:
        break
#print('{} номер оставшегося человека'.format(list_people[0]))


И ещё - как самый верхний код адаптировать под ситуацию, когда idx будет больше количества людей в кругу? Пытался в цикле "пока число больше людей в кругу" отбавлять количество символов, чтобы как бы оно сначала начало считать, но всё равно выводит ошибку выхода за пределы диапазона.

Добавлено через 1 час 5 минут
Python
1
2
3
4
5
6
7
8
9
10
def josephus(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])

Условие с числом больше длины списка решил. Осталось разобраться во всё другом
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2018, 07:50
Ответы с готовыми решениями:

Задача Иосифа Флавия
В современной формулировке задачи участвует n воинов и убивают каждого m-го. Требуется определить...

Задача Иосифа Флавия
100 человек стоят по кругу, им присвоены номера от 1 до 100. Они начинают считаться и каждый 19-й...

Задача Иосифа Флавия
(Считалка) n детей размещаются по кругу. Начиная отсчет от первого, исключают каждого k-го,...

Задача Иосифа Флавия на С
Выдает ошибку сегментирования (сделан дамп памяти). Помогите решить проблему #include...

Задача Иосифа Флавия
Решил попробовать сделать,через словарь. Затруднение в том,как убирать,каждый k-ый. Вокруг...

4
1292 / 909 / 479
Регистрация: 05.12.2013
Сообщений: 3,074
19.08.2018, 08:38 2
Цитата Сообщение от SamJa Посмотреть сообщение
Условие с числом больше длины списка решил
Нет, неправильно считает

1 выбывает
1 Это IDX
3 выбывает
3 Это IDX
6 выбывает
2 Это IDX
5 выбывает
0 Это IDX
2 выбывает
1 Это IDX
7 выбывает
0 Это IDX
survivor: 4
а должно быть

1 выбывает
0 Это IDX
2 выбывает
0 Это IDX
3 выбывает
0 Это IDX
4 выбывает
0 Это IDX
5 выбывает
0 Это IDX
6 выбывает
0 Это IDX
survivor: 7
Python
1
2
3
4
5
6
7
8
def josephus(ls, skip):
    skip -= 1
    skip %= len(ls)
    while len(ls) > 1:
        print(ls.pop(skip),"выбывает") 
        skip = skip * 2 % len(ls)
        print(skip,"Это IDX")
    print('survivor: ', ls[0])
0
6 / 6 / 0
Регистрация: 18.10.2017
Сообщений: 51
19.08.2018, 14:30  [ТС] 3
Почему?
Вот список 1,2,3,4,5,6,7
Удаляем 8-ое : 1-2-3-4-5-6-7-1 [1] удаляем
2-3-4-5-6-7-1-2-3 [3] удаляем
2-4-5-6-7-2-4-5-6 [6] удаляем

ну и так далее
0
1292 / 909 / 479
Регистрация: 05.12.2013
Сообщений: 3,074
19.08.2018, 19:24 4
1-2-3-4-5-6-7-1 [1] удаляем
2-3-4-5-6-7-1-2-3 [3] удаляем
2-4-5-6-7-2-4-5-6 [6] удаляем

Неправильно, во втором и третьем рядах на одну цифру больше
0
6 / 6 / 0
Регистрация: 18.10.2017
Сообщений: 51
20.08.2018, 05:22  [ТС] 5
Больше, потому что я неправильно написал
1-2-3-4-5-6-7-1 [1] удаляем
2-3-4-5-6-7-2-3 [3] удаляем
4-5-6-7-2-4-5-6 [6] удаляем
0
20.08.2018, 05:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2018, 05:22
Помогаю со студенческими работами здесь

Задача Иосифа Флавия
Хмм, а что вы думаете о нем и его задаче? Очень интересно Ваше мнение т.к. пишу по этой теме работу

Задача Иосифа Флавия
всем привет, я студент, у которого в программе есть информатика. нам задали вот такую задачу на...

Задача Иосифа Флавия
Помогите написать общую программу по этой задаче Задача Иосифа Флавия или считалка Джозефуса —...

Задача Иосифа Флавия
помогите написать комменнтарии к задаче и подскажите как заставить ее работать на Visual Studio...

Задача Иосифа Флавия
По окружности в направлении движения часовой стрелки расположены n последовательных натуральных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru