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

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

08.12.2013, 11:40. Показов 4167. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите написать общую программу по этой задаче

Не по теме:

Задача Иосифа Флавия или считалка Джозефуса — известная математическая задача с историческим подтекстом.

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

В современной формулировке задачи участвует n воинов, стоящих по кругу, и убивают каждого m-го. Требуется определить номер k начальной позиции воина, который остнется последним.

- сама задача

на C++ (если поможет)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
 
void PrintWarriors( int* war, int n ) {
 
int i ;
 
for ( i = 0; i < n; i++ )
printf( "%3d", war[i] ) ;
printf( "\n" ) ;
 
}
 
int GetNextWarriorToKill( int* war, int jLastKilled, int n, int k ) {
 
int jToKill = jLastKilled + 1 ,
kLive = 1 ;
 
do {
if ( jToKill == n )
jToKill = 0 ;
else {
if (war[jToKill++] == 0 ) 
++kLive ;
}
} while ( kLive <= k ) ;
 
return jToKill-1 ;
 
}
 
int main() {
 
const int n = 10,
k = 3 ;
int i, 
jLastKilled = -1 ,
jToKill ,
nKilled = 0;
int war[1000] ;
 
for ( i = 0; i < n; i++ )
war[i] = 0 ;
 
while ( nKilled < n-1 ) {
jToKill = GetNextWarriorToKill( war, jLastKilled, n, k ) ;
war[jToKill] = ++nKilled ;
jLastKilled = jToKill ;
PrintWarriors( war, n ) ;
}
PrintWarriors( war, n ) ;
 
for ( i = 0; i < n, war[i] != 0; i++ ) 
;
printf( "The last warrior has #%d (counting from 1)\n", i+1 ) ;
 
return 0 ;
}
и на Pascal
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var i, N, K, col, temp: longint;
var c: array[1..500] of boolean;
begin
  assign(input, 'input.txt'); reset(input);
  assign(output, 'output.txt'); rewrite(output);
  read(N,K);
  i:=1;
  while col<N-1 do
  begin
  temp:=0;
  while temp<K do
  begin
  if c[i]=false then
  inc(temp);
  inc(i);
  if i=N+1 then
  i:=1;
  end;
  if i>1 then c[i-1]:=true
  else
  c[N]:=true;
  inc(col);
  end;
  for i:=1 to N do
  if c[i]=false then
  col:=i;
  writeln(col);
end.
нарыл в инете 2 варианта
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
uses crt;
var a:array[1..500]of integer;
    i,j,k,n:integer;
begin
{вводим количество}
repeat
write('N:');
readln(n);
until (n>1)and(n<=500);
{вводим счетчик}
repeat
write('K:');
readln(k);
until (k>0)and(k<=100);
{раставляем всех по кругу}
for i:=1 to n do
a[i]:=i;
{начальное значение}
i:=0;
repeat
{вычисляем новое значение}
i:=(i+k-1)mod n+1;{к текущему номеру прибавляем шаг-1, берем остаток от деления на n+1}
{удаляем человека из круга}
for j:=i to n-1 do {сдвигаем конец массива на это число}
a[j]:=a[j+1];
dec(n); {уменьшаем размер массива}
{корректируем указатель}
dec(i);{на шаг назад}
until n=1;
{выводим результат}
writeln('Остался номер ',a[1]);
readln
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2013, 11:40
Ответы с готовыми решениями:

Задача Иосифа Флавия
Здравствуйте! Пытаясь ответить на вопрос одного из пользователей данного форума, решил в лоб...

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

Задача Иосифа Флавия
Всем привет. Помогите пожалуйста с этой задачей. Никак допедрить не могу. вот код: ...

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

28
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
08.12.2013, 18:45 2
Ну где-то так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub FlaviyIosif()
    Dim n&, k&, a&(), i&, m$
    n = InputBox("Âîèíîâ?")
    k = InputBox("óìèðàåò êàæäûé?")
    ReDim a(1 To n)
    For i = 1 To n
        a(i) = i
    Next
    i = 1
    v = 0 'ñ÷åò÷èê âîèíîâ k
    u = 0 'êîë-âî óáûòûõ âîèíîâ
    Do
        If i > n Then i = 1
        If a(i) <> 0 Then
            v = v + 1
            If v = k Then
                a(i) = 0
                u = u + 1
                If n - u < k Then Exit Do 'åñëè êîë-âî æèâûõ ìåíüøå k
                v = 0
            End If
        End If
        i = i + 1
    Loop
    For i = 1 To n
        If a(i) <> 0 Then m = m & IIf(m = "", "", ", ") & i
    Next
    MsgBox "Âîèíû íà ìåñòàõ - " & m & "- îñòàëèñü æèâû"
End Sub
1
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 12
08.12.2013, 18:58  [ТС] 3
ReDim a(1 To n) что означает?
а так спасибо) но почему то не работает
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
08.12.2013, 19:01 4
Visual Basic
1
ReDim a(1 To n)
Задать размер массива.
Проверял в Excel, работает четко.
Выдает ошибку?
1
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 12
08.12.2013, 19:01  [ТС] 5
и вот
If a(i) <> 0 Then m = m & IIf(m = "", "", ", ") & i
эта строчка тоже не понятна
можно ли альтернативно написать как первый курс
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
08.12.2013, 19:06 6
Эта строка для получения номеров мест оставшихся в живых перечисляя их через запятую.

Добавлено через 1 минуту
Цитата Сообщение от Эрлан Посмотреть сообщение
как первый курс
Куда уж проще!
0
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 12
08.12.2013, 19:10  [ТС] 7
да мы ещё не проходили это
не поверит, а мне зачет надо)
мы тут array используем, IIf вообще понятия не имею
Dim n&, k&, a&(), i&, m$ а тут какой оператор?
извиняюсь наверное вопросы тупые, но мне надо понять её)
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
08.12.2013, 19:16 8
Ну если смущает функция IIf распиши ее через оператор IF
т.е.
Visual Basic
1
m=IIf(m = "", "", ", ")
одинаково с
Visual Basic
1
2
3
4
5
If m="" then
    m=m
else
    m=m & ", "
endif
1
997 / 356 / 135
Регистрация: 27.10.2006
Сообщений: 764
08.12.2013, 19:17 9
toiai, вот так захочешь помочь человеку, сперва с программой мучаешься, а потом ещё мучайся объясняй, как она работает ) ) Видно судьба у нас такая нелёгкая )
1
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
08.12.2013, 19:21 10
А нажать клавишу F1 в VBA и почитать, что вас интересует.
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
08.12.2013, 19:25 11
Цитата Сообщение от Эрлан Посмотреть сообщение
да мы ещё не проходили это
а вы взяли - да и изучили самостоятельно!
чем не вариант?
0
11511 / 3797 / 681
Регистрация: 13.02.2009
Сообщений: 11,209
08.12.2013, 19:36 12
А нажать клавишу F1 в VBA и почитать,
Похоже от слишком частого применения клавиша вышла из строя!!
0
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 12
08.12.2013, 20:09  [ТС] 13
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Sub FlaviyIosif()
    Dim n&, k&, a&(), i&, m$
    n = InputBox("êîë-âî âîèíîâ")
    k = InputBox("óìèðàåò êàæäûé")
    ReDim a(1 To n)
    For i = 1 To n
        a(i) = i
    Next
    i = 1
    v = 0 'ñ÷åò÷èê âîèíîâ k
    u = 0 'êîë-âî óáèòûé âîèíîâ
    Do
        If i > n Then i = 1
        If a(i) <> 0 Then
            v = v + 1
            If v = k Then
                a(i) = 0
                u = u + 1
                If n - u < k Then Exit Do 'åñëè êîë-âî æèâûõ ìåíüøå k
                v = 0
            End If
        End If
        i = i + 1
    Loop
    For i = 1 To n
        If a(i) <> 0 Then
            If m = "" Then
                m = m
            Else
            m = m & ", "
            End If
        End If
    Debug.Print m, i, v, u
    Next i
    MsgBox "Âîèíû íà ìåñòàõ - " & m & "- îñòàëèñü æèâû"
End Sub
не хочет работать

Добавлено через 41 секунду
Цитата Сообщение от ikki Посмотреть сообщение
а вы взяли - да и изучили самостоятельно!
чем не вариант?
врятли он поверит
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
08.12.2013, 20:14 14
Цитата Сообщение от Эрлан Посмотреть сообщение
врятли он поверит
не, ну конечно глаза должны быть честными. это обязательно.
0
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 12
08.12.2013, 20:16  [ТС] 15
Цитата Сообщение от ikki Посмотреть сообщение
не, ну конечно глаза должны быть честными. это обязательно.
он за эту программу 10 баллов дает, и сказал что я должен её объяснить от и до что? куда? зачем? от куда?
вообще как то так я тут вообще мало что понимаю
особенное ReDim, а задание операторов без типа
слоупок вообщем
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
08.12.2013, 20:17 16
Интересно, если не работает, то что-же VBA сообщает на Ваше желание запустить программу?
0
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 12
08.12.2013, 20:18  [ТС] 17
Цитата Сообщение от toiai Посмотреть сообщение
Интересно, если не работает, то что-же VBA сообщает на Ваше желание запустить программу?
работает, но значения не верны
сделал debug m, i, v, u
вот результат
1 3 39
2 3 39
3 3 39
4 3 39
5 3 39
6 3 39
7 3 39
8 3 39
9 3 39
10 3 39
11 3 39
12 3 39
13 3 39
14 3 39
15 3 39
16 3 39
17 3 39
18 3 39
19 3 39
20 3 39
21 3 39
22 3 39
23 3 39
24 3 39
25 3 39
26 3 39
27 3 39
28 3 39
29 3 39
30 3 39
31 3 39
32 3 39
33 3 39
34 3 39
35 3 39
36 3 39
37 3 39
38 3 39
39 3 39
40 3 39
41 3 39
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
08.12.2013, 20:21 18
Цитата Сообщение от Эрлан Посмотреть сообщение
задание операторов без типа
во-первых, если вы будете называть это операторами, то никакой десятки вам точно не видать.
это переменные.
во-вторых - почему без типа? тип есть. задан символом после имени переменной:
Visual Basic
1
Dim n&, k&, a&(), i&, m$
если оч.хочется, можете записать так:
Visual Basic
1
Dim n as long, k as long, a() as long, i as long, m as string
0
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 12
08.12.2013, 20:22  [ТС] 19
вот)
а ReDim a(1 To n) это массив?
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
08.12.2013, 20:24 20
Вставьте после 32 строки Вашего кода:
Visual Basic
1
m=m & i
да еще у меня не определена переменная u
Visual Basic
1
Dim u as long
0
08.12.2013, 20:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2013, 20:24
Помогаю со студенческими работами здесь

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

Задача иосифа флавия
N человек играют в следующую игру: стоя в кругу они начинают считалку. Счёт идёт до числа M....

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

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


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

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

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