Josephus-Problem (Felder)
Es stehen n Personen in einem Kreis. Die Personen sind nummeriert von 1 bis n. Beginnend bei Person Nummer p wird nun jede p-te Person aus dem Kreis entfernt und der Kreis danach sofort wieder geschlossen (jede Person behält dabei ihre anfänglich zugewiesene Nummer).
Geben Sie die Nummern der entfernten Personen in der Reihenfolge an, in der sie entfernt wurden.
Diese Reihenfolge wird Josephus-Permutation genannt.
Als Eingabe Ihres Programmes benötigen Sie lediglich die Zahlen n und p.
4 Kommentare (ansehen)
19 Lösung(en) (ansehen)
- c
- java
- java
- ruby
- ruby
- abap
- cpp
- groovy
- delphi
- delphi
- java
- python
- php
- javascript
- python
- python
- csharp
- csharp
- cpp
01.
/* this file is hereby released into the public domain */
02.
03.
#include <stdio.h>
04.
#include <stdlib.h>
05.
#include <string.h>
06.
07.
static
void
put_number(
int
n)
08.
{
09.
static
int
init;
10.
11.
if
(init)
12.
printf
(
", "
);
13.
else
14.
init = 1;
15.
16.
printf
(
"%d"
, n);
17.
}
18.
19.
static
void
josephus(
int
n,
int
p)
20.
{
21.
char
*array;
22.
int
i;
/* Arrayiterator */
23.
int
v;
/* virtuelle Position, d.h. Position im aktuellen Kreis */
24.
int
removed;
25.
26.
if
(n < 1 || p < 1) {
27.
printf
(
"Ungültige Eingabe: n = %d, p = %d\n"
, n, p);
28.
exit
(EXIT_FAILURE);
29.
}
30.
31.
array =
malloc
(n);
32.
if
(!array) {
33.
printf
(
"Zu wening Arbeitsspeicher (n = %d)\n"
, n);
34.
exit
(EXIT_FAILURE);
35.
}
36.
37.
memset
(array, 0, n);
38.
39.
v = 1;
/* der Erste (Nullte) wird übersprungen */
40.
for
(i = removed = 0; removed < n; ) {
41.
if
(!array[i]) {
42.
if
((v % p) == 0) {
43.
array[i] = 1;
44.
removed++;
45.
/* +1 um ab Eins zu zählen */
46.
put_number(i + 1);
47.
}
48.
v++;
49.
}
50.
51.
if
(++i == n)
52.
i = 0;
53.
}
54.
55.
free
(array);
56.
57.
putchar
(
'\n'
);
58.
}
59.
60.
int
main(
int
argc,
char
**argv)
61.
{
62.
if
(argc == 3)
63.
josephus(
atoi
(argv[1]),
atoi
(argv[2]));
64.
else
65.
printf
(
"Aufruf: %s <Anzahl Personen> <Schrittweite>\n"
, argv[0]);
66.
67.
return
EXIT_SUCCESS;
68.
}
Lösung von: Jonathan Neuschäfer (St.-Bernhard-Gymnasium, 47877 Willich)
01.
/**
02.
* @author Till Hardenbicker
03.
* @version 1 28. August 2011 mit BlueJ (Java)
04.
*/
05.
public
class
Josephus
06.
{
static
int
n;
static
int
p;
07.
static
int
index=n-
1
;
08.
static
int
[] Kreis;
09.
10.
public
Josephus(
int
anzahl_personen,
int
ausscheidungsrate)
11.
{
12.
n=anzahl_personen;
13.
p=ausscheidungsrate;
14.
15.
Kreis =
new
int
[n];
16.
for
(
int
i=
0
; i<n; i++)
17.
{Kreis[i]=i+
1
;}
18.
19.
main();
20.
}
21.
22.
static
int
weiter()
23.
{
24.
if
(index==n-
1
)
25.
{index=
0
;}
//wenn wir am Ende des Kreises sind, müssen wir wieder zum Anfang zurückspringen.
26.
else
{index++;}
//sonst gehts normal weiter.
27.
if
(Kreis[index]==
0
)
//ist die Person ausgeschieden...
28.
{weiter();}
//...gehts nochmal weiter.
29.
return
Kreis[index];
//jetzt wird die Person "neben" uns zurückgegeben.
30.
}
31.
32.
static
void
main()
33.
{
for
(
int
j=
1
; j<=n; j++)
//insgesamt müssen n personen ausscheiden.
34.
{
for
(
int
k=
1
; k<=p; k++)
35.
{weiter();
//jedesmal gehen wir p schritte weiter(); im kreis.
36.
}
37.
System.out.println(Kreis[index]);
38.
Kreis[index]=
0
;
//die person scheidet aus. wird also =0 gesetzt.
39.
}
40.
41.
}
42.
}
Lösung von: Till Hardenbicker (St. Angela Gymnasium Wipperfürth)
01.
package
ch.programmieraufgaben.josephus;
02.
03.
import
java.util.Scanner;
04.
05.
/**
06.
* Josephus Problem mit Ausgabe der Josephus Permutation.
07.
* @author Philipp Gressly (phi@gressly.ch)
08.
*/
09.
public
class
Josephus {
10.
11.
class
Person {
12.
int
nummer;
13.
Person next;
14.
}
15.
16.
public
static
void
main(String[] args) {
17.
new
Josephus().top();
18.
}
19.
20.
void
top() {
21.
Person startPerson = init(leseInt(
"Anzahl Personen"
));
22.
eliminiereAlle(startPerson, leseInt(
"Löschindex (p)"
));
23.
}
24.
25.
/**
26.
* Erstelle Kreis komplett mit ".next" verlinkt.
27.
* @return Zeiger auf erste Person (mit Nummer 1)
28.
*/
29.
Person init(
int
anzahl) {
30.
Person erster =
new
Person();
31.
erster.nummer =
1
;
32.
Person letzter = erster;
33.
for
(
int
i =
2
; i <= anzahl; i++) {
34.
Person neuePerson =
new
Person();
35.
neuePerson.nummer = i;
36.
letzter.next = neuePerson;
37.
letzter = neuePerson;
38.
}
39.
letzter.next = erster;
40.
return
erster;
41.
}
42.
43.
void
eliminiereAlle(Person erste,
int
p) {
44.
if
(erste.next == erste) {
45.
System.out.println(erste.nummer);
// ende
46.
return
;
47.
}
48.
Person prev = erste;
49.
Person akt = erste;
50.
for
(
int
i =
1
; i <= p-
1
; i++) {
51.
prev = akt;
52.
akt = akt.next;
53.
}
54.
System.out.println(akt.nummer);
55.
prev.next = akt.next;
//Eliminationsschritt
56.
eliminiereAlle(akt.next, p);
57.
}
58.
59.
Scanner sc =
new
Scanner(System.in);
60.
int
leseInt(String frage) {
61.
System.out.println(frage +
": "
);
62.
return
sc.nextInt();
63.
}
64.
65.
}
// end of class Josephus
Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)
01.
def
josephus(n,p)
02.
da =
Array
.
new
(n,
true
)
# Wer ist noch da (0-basiert)
03.
raus = []
# Reihenfolge wer raus ist
04.
position = n-
1
;
# Startposition (damit p-1 zuerst raus muss).
05.
n.times {
# n-Mal
06.
p.times {
# p Positionen vorrücken
07.
begin
08.
position = (position +
1
) % n
09.
end
until
da[position]
# vorrücken, bis die Person noch da ist
10.
}
11.
raus.push(position)
# Position merken
12.
da[position] =
false
# Person rausschmeissen
13.
}
14.
return
raus.map{|i| i+
1
}
# Indizies um 1 erhöhen
15.
end
16.
17.
18.
print
"n = "
19.
n = gets.to_i
# n einlesen
20.
21.
print
"p = "
22.
p = gets.to_i
# p einlesen
23.
24.
puts josephus(n,p).join(
","
)
# Lösung ausgeben
Lösung von: Ivo Blöchliger (Kantonsschule Wohlen)
01.
# Und jetzt noch wirklich quick & dirty ;-)
02.
03.
print
"n = "
04.
n = gets.to_i
# n einlesen
05.
06.
print
"p = "
07.
p = gets.to_i
# p einlesen
08.
09.
personen = (
1
..n).to_a
# [1,2,3, ... ,n]
10.
11.
position =
0
;
# Position für Rauswurf
12.
raus = [];
13.
14.
n.times {
# \/ -1 weil die Position auf der fehlenden Person ist
15.
position = (position+p-
1
) % personen.size
# Vorrücken
16.
raus.push(personen.delete_at(position));
# Rauswerfen
17.
}
18.
19.
puts raus.join(
", "
)
# Lösung ausgeben
Lösung von: Ivo Blöchliger (Kantonsschule Wohlen)
*&---------------------------------------------------------------------*
*& Report Z_JOSEPHUS_PROB
*&
*&---------------------------------------------------------------------*
*& !!! PROGRAMMING LANGUAGE IS ABAP !!!
*& PROGRAMMER: Benjamin Kluszynski
*&---------------------------------------------------------------------*
REPORT z_josephus_prob.
PARAMETERS: l_m TYPE i, "amount of people in the circle
l_n TYPE i. "step to kill them .. :-)
DATA: gt_input TYPE STANDARD TABLE OF i,
gl_input LIKE LINE OF gt_input,
gt_already_dead TYPE STANDARD TABLE OF I,
gl_already_dead LIKE LINE OF gt_already_dead,
l_already_dead_amount TYPE I,
l_table_count TYPE I,
l_relevant_count TYPE I.
"initialize table
DO l_m TIMES.
gl_input = l_m.
APPEND l_m TO gt_input.
ENDDO.
WHILE l_already_dead_amount < l_m. " until all people are dead
WHILE l_relevant_count < l_n. " until the next l_n of relevant person are found
ADD 1 TO l_table_count. " go ahead
IF l_table_count GT l_m. " if the end of array is reached.. go to index 1 again
l_table_count = 1.
ENDIF.
"look if its already "dead"
READ TABLE gt_already_dead WITH TABLE KEY table_line = l_table_count INTO gl_already_dead.
"if not, then this one is relevant for counting
IF gl_already_dead IS INITIAL.
ADD 1 TO l_relevant_count.
ENDIF.
CLEAR gl_already_dead.
ENDWHILE.
"save this one to the already murdered ones.. :-)
gl_already_dead = l_table_count.
APPEND gl_already_dead to gt_already_dead.
WRITE: / gl_already_dead, ' is dead now.'.
l_relevant_count = 0.
ADD 1 TO l_already_dead_amount.
CLEAR gl_already_dead.
ENDWHILE.
Lösung von: Benjamin Kluszynski (( Coder :-) ))
01.
// Autor: Andy Großhennig
02.
// Solution for task: Josephus-Problem (Felder)
03.
04.
#include <iostream>
05.
06.
using
namespace
std;
07.
08.
// Function: Get the size of the circle and the selection of people
09.
void
getNumbers(
int
i_arrCircleSize[2],
int
&iMultiplier)
10.
{
11.
cout <<
"Wieviel Personen stehen im Kreis? "
;
12.
cin >> i_arrCircleSize[0];
13.
cout <<
"\nJede wievielte Person wird entfernt? "
;
14.
cin >> iMultiplier;
15.
cout <<
"\n\n"
;
16.
17.
i_arrCircleSize[1] = i_arrCircleSize[0];
18.
}
19.
20.
// Function: Simulates the circle and the decrease of the selection
21.
void
circle()
22.
{
23.
int
i_arrCircleSize[2];
//1: Original size, 2: Current size
24.
int
iMultiplier;
//Selection of people
25.
26.
getNumbers(i_arrCircleSize, iMultiplier);
27.
28.
// Loop: Repeat the decrease until the last people is removed
29.
while
(i_arrCircleSize[1] >= iMultiplier)
30.
{
31.
i_arrCircleSize[1] -= iMultiplier;
//Remove the next people
32.
cout << (i_arrCircleSize[0] - i_arrCircleSize[1]) << endl;
//Show the current removed people
33.
}
34.
}
35.
36.
int
main()
37.
{
38.
circle();
39.
40.
cout <<
"\n\n"
;
41.
system
(
"Pause"
);
42.
return
0;
43.
}
Lösung von: Andy Großhennig (Bundeswehr)
01.
k =
2
02.
n =
4
03.
//Alle Personen im Kreis, true = lebt, false = tot
04.
kreis = [true] * n
05.
println
kreis
06.
pos = -
1
07.
anzFalse =
0
08.
while
(anzFalse < n) {
09.
for (
int
counter =
0
; counter < k; counter++) {
10.
pos = pos +
1
11.
//wenn die nächsten schon tot sind, werden sie übersprungen
12.
while
(!kreis [pos.mod(n)]) {
13.
pos = pos +
1
14.
}
15.
if
(counter == k -
1
) {
16.
kreis[pos.mod(n)] = false
17.
anzFalse = anzFalse +
1
18.
//das ist der Letzte
19.
if
(anzFalse == n) {
20.
println
((pos.mod(n) +
1
) +
" überlebt"
)
21.
}
else
{
22.
println
((pos.mod(n) +
1
) +
" ist tot"
)
23.
}
24.
}
25.
}
26.
}
Lösung von: Silvia Rothen (rothen ecotronics)
01.
function
josephus2(n,k:
byte
):
integer
;
02.
var
r,i:
integer
;
03.
begin
04.
r:=
0
; i:=
2
;
05.
while
i <= n
do
begin
06.
r:= (r+k)
mod
i;
07.
inc(i)
08.
end
;
09.
result:= r+
1
10.
end
;
11.
12.
13.
14.
//As a recursion!:
15.
16.
function
josephus_rec(n,k:
byte
):
integer
;
17.
begin
18.
if
n =
1
then
19.
result:=
1
20.
else
21.
result:= (josephus_rec(n-
1
,k) +k-
1
)
mod
n+
1
22.
end
;
Lösung von: Max Kleiner (BFH)
01.
// shows circel rounds as lines, '1' survived, 'X' is dead
03.
//
04.
procedure
josephusProblem_Graphic(n,k:
integer
);
05.
var
i,p,kt:
smallint
;
06.
aist:
array
of
char
;
07.
begin
08.
SetArrayLength(aist,n);
09.
kt:=
2
;
//or k
10.
p:=
0
;
11.
for
i:=
0
to
length(aist)-
1
do
aist[i]:=
'1'
;
//init array
12.
while
kt <= length(aist)
do
begin
13.
for
i:=
0
to
length(aist)-
1
do
begin
14.
if
aist[i]=
'1'
then
inc(p);
15.
if
p = k
then
begin
16.
aist[i]:=
'X'
;
17.
inc(kt);
18.
p:=
0
;
19.
end
;
20.
end
;
21.
for
i:=
0
to
length(aist)-
1
do
//line out
22.
write
(aist[i]+
' '
);
23.
writeln
(
''
);
24.
end
;
25.
for
i:=
0
to
length(aist) -
1
do
//solution out
26.
if
aist[i]=
'1'
then
writeln
(
'Sol '
+inttoStr(i+
1
));
27.
end
;
28.
29.
30.
call:
31.
josephusProblem_Graphic(
41
,
3
);
32.
33.
output:
34.
1
1
X
1
1
X
1
1
X
1
1
X
1
1
X
1
1
X
1
1
X
1
1
X
1
1
X
1
1
X
1
1
X
1
1
X
1
1
X
1
1
35.
X
1
X
1
X X
1
1
X X
1
X
1
X X
1
1
X X
1
X
1
X X
1
1
X X
1
X
1
X X
1
1
X X
1
X
1
X
36.
X
1
X
1
X X X
1
X X
1
X X X X
1
1
X X X X
1
X X
1
X X X
1
X
1
X X X
1
X X
1
X X X
37.
X
1
X
1
X X X X X X
1
X X X X
1
X X X X X
1
X X
1
X X X X X
1
X X X
1
X X X X X X
38.
X
1
X
1
X X X X X X X X X X X
1
X X X X X
1
X X X X X X X X
1
X X X
1
X X X X X X
39.
X X X
1
X X X X X X X X X X X
1
X X X X X X X X X X X X X X
1
X X X
1
X X X X X X
40.
X X X X X X X X X X X X X X X
1
X X X X X X X X X X X X X X
1
X X X X X X X X X X
41.
X X X X X X X X X X X X X X X
1
X X X X X X X X X X X X X X
1
X X X X X X X X X X
42.
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
1
X X X X X X X X X X
43.
Sol
31
Lösung von: Max Kleiner (BFH)
01.
import
java.util.Scanner;
02.
03.
public
class
josephusproblem {
04.
05.
// Führt die Mutation aus
06.
private
String permutation(
int
n,
int
p) {
07.
08.
// Beinhaltet am Ende der Methode das Ergebniss
09.
String ausgabe =
""
;
10.
11.
// pickt die Nummern der Personen heraus
12.
int
d = p;
13.
14.
// Setzt das Ergebniss zusammen
15.
while
(d < n +
1
) {
16.
17.
// fügt Komma ein wenn mehr als eine Person entfernt wird
18.
if
(d != p) {
19.
ausgabe = ausgabe +
", "
;
20.
}
21.
22.
// entfernte Person wird mit in den String eingeschrieben
23.
ausgabe = ausgabe + String.valueOf(d);
24.
d = d + p;
25.
26.
}
27.
28.
// wenn keine Person entfernt wurde wird der String mit "---" gefüllt
29.
if
(ausgabe.equals(
""
)) {
30.
ausgabe =
"---"
;
31.
}
32.
return
ausgabe;
33.
}
34.
35.
// Hauptmethode
36.
public
static
void
main(String[] args) {
37.
// Klassenobjekt um auf die Methode zugreifen zu können
38.
josephusproblem tue =
new
josephusproblem();
39.
40.
// Scanner zum Einlesen der Nummern
41.
Scanner scan =
new
Scanner(System.in);
42.
43.
// Eingabeaufforderungen + Eingaben
44.
System.out.println(
"Geben Sie die Anzahl an Leuten an:"
);
45.
int
n = scan.nextInt();
46.
System.out
47.
.println(
"Geben Sie den Platz der Person in dem Kreis,\ndie als erstes entfernt werden soll, an:"
);
48.
int
p = scan.nextInt();
49.
scan.close();
50.
51.
// Ergebniss wird ausgegeben
52.
System.out.println(
"Die Persone/n an den/m Platz/Plaetzen "
53.
+ tue.permutation(n, p) +
" wurden aus dem Kreis enfternt"
);
54.
}
55.
56.
}
Lösung von: Sebastian Littel ()
01.
n
=
int(raw_input(
'Anzahl der Personen: '
))
02.
p
=
int(raw_input(
'Schrittweite: '
))
03.
04.
reihe
=
range(
1
,n
+
1
)
05.
gefunden
=
[]
06.
07.
while
len(gefunden)<n:
08.
09.
# i...Reihen-Index
10.
i
=
p
%
len(reihe)
11.
if
i
=
=
0
:
12.
i
=
len(reihe)
13.
i
-
=
1
14.
15.
gefunden.append(reihe.pop(i))
16.
reihe
=
reihe[i::]
+
reihe[
0
:i]
17.
18.
print
gefunden
19.
20.
''' -*- Bsp für n=8, p=5, 1. Durchlauf:
21.
22.
reihe = [1 2 3 4 5 6 7 8]
23.
24.
i = p%len(reihe) = 5%8 = 5
25.
i = i-1 = 4 (Person '5' steht in Liste an Stelle 4)
26.
27.
gefunden = [reihe[i]] = [reihe[4]] = [5]
28.
reihe = [1 2 3 4 6 7 8]
29.
30.
reihe = reihe[i::]+reihe[0:i]
31.
reihe = [6 7 8 1 2 3 4]
32.
33.
-*- Ende 1. Durchlauf '''
Lösung von: Steffen Jähn ()
01.
HTML-Code:
02.
03.
<!DOCTYPE html>
04.
<html lang=
"en"
>
05.
<head>
06.
<meta charset=
"UTF-8"
>
07.
<title>Title</title>
08.
</head>
09.
<body>
10.
<form action=
"josephusPermutation.php"
method=
"post"
>
11.
<input type=
"number"
min=
"0"
name=
"anzahl"
>Tragen Sie hier
die
Anzahl ein<br></input>
12.
<input type=
"number"
min=
"0"
name=
"p"
>Tragen Sie hier
"p"
ein<br></input>
13.
<input type=
"submit"
value=
"Abschicken"
/><input type=
"reset"
/>
14.
</form>
15.
16.
17.
</body>
18.
</html>
19.
20.
21.
PHP-Code:
22.
23.
<?php
24.
$anzahlDerLeute
=
$_POST
[
"anzahl"
];
//Anzahl der Leute
25.
$p
=
$_POST
[
"p"
];
//Beginnend bei der p-ten Person
26.
27.
28.
$i
=
$p
;
29.
$ausgabe
=
""
;
30.
31.
while
(
$i
<=
$anzahlDerLeute
)
32.
{
33.
if
(
$i
!=
$p
)
34.
{
35.
$ausgabe
.=
", "
;
36.
}
37.
38.
$ausgabe
.=
$i
;
39.
40.
$i
+=
$p
;
41.
}
42.
43.
echo
$ausgabe
;
44.
45.
46.
?>
Lösung von: Maik Scheiermann (Powercloud GmbH)
01.
function
josephusCount(people, skip) {
02.
var
circle = [],
03.
executed = [],
04.
counter;
05.
for
(counter = 1; counter <= people; counter++) circle.push(counter);
06.
07.
counter = 0;
08.
while
(circle.length > 0) {
09.
counter = (counter - 1 + skip) % circle.length;
10.
executed.push(circle.splice(counter, 1)[0]);
11.
}
12.
return
executed;
13.
}
14.
15.
console.log(josephusCount(7, 4).join(
", "
));
16.
console.log(josephusCount(8, 5).join(
", "
));
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
01.
def
josephus(n,k):
02.
l
=
list(range(
1
,n
+
1
))
03.
josephus_permutation
=
[]
04.
m
=
0
05.
while
len(l)>
0
:
06.
for
i
in
range(k):
07.
p
=
(i
+
m)
%
len(l)
08.
if
p
=
=
len(l)
-
1
:
09.
m
=
0
10.
else
:
11.
m
=
p
12.
josephus_permutation.append(l[p])
13.
del
l[p]
14.
15.
return
josephus_permutation
Lösung von: Matthias Richter (BIP Kreativitätsgymnasium, Leipzig)
1.
n, p
=
int(input(
"n: "
)), int(input(
"p: "
))
2.
in_list, out_list, curr_index
=
list(range(
1
, n
+
1
)), [],
0
3.
while
in_list:
4.
out_list.append(in_list.pop((curr_index:
=
(curr_index
+
p
-
1
)
%
len(in_list))))
5.
print
(out_list)
Lösung von: Name nicht veröffentlicht
01.
using
System;
02.
using
System.Collections.Generic;
03.
using
System.Linq;
04.
using
System.Text;
05.
using
System.Threading.Tasks;
06.
07.
namespace
Josephus_Problem
08.
{
09.
10.
class
Program
11.
{
12.
static
void
Main(
string
[] args)
13.
{
14.
int
menge = 0;
15.
int
person = 0;
16.
List<
int
> kreis =
new
List<
int
>();
17.
List<
int
> ausgeschPerson =
new
List<
int
>();
18.
19.
Console.WriteLine(
"Wieviele Personen sollen es sein?"
);
20.
menge = Convert.ToInt32(Console.ReadLine());
21.
Console.WriteLine(
"Die jeweils wievielte Person soll den Kreis verlassen?"
);
22.
person = Convert.ToInt32(Console.ReadLine());
23.
24.
for
(
int
i = 0; i < menge; i++)
25.
{
26.
kreis.Add(i);
27.
}
28.
for
(
int
i = person; i < kreis.Count; i+=person)
29.
{
30.
ausgeschPerson.Add(kreis[i]);
31.
kreis.Remove(kreis[i]);
32.
}
33.
Console.WriteLine();
34.
foreach
(
int
a
in
ausgeschPerson)
35.
{
36.
Console.WriteLine(a);
37.
}
38.
Console.ReadKey();
39.
40.
}
41.
}
42.
}
Lösung von: Chrischi Leif (S&N Datentechnik)
01.
// NET 6.x | C# 10.x | VS-2022
02.
03.
static
IEnumerable<
int
> Josephus(
int
n,
int
p) {
04.
var i = 0;
05.
var rng = Enumerable.Range(1, n).ToList();
06.
while
(rng.Count > 0) {
07.
i = (i - 1 + p) % rng.Count;
08.
yield
return
rng[i];
09.
rng.RemoveAt(i);
10.
}
11.
}
12.
13.
Console.WriteLine(
string
.Join(
", "
, Josephus(7, 4)));
Lösung von: Jens Kelm (@JKooP)
01.
// C++ 17
02.
#include <iostream>
03.
#include <vector>
04.
#include <numeric>
05.
06.
std::vector<
int
> Josephus(
int
n,
int
p) {
07.
unsigned
long
long
i{ 0 };
08.
std::vector<
int
> rng(n);
09.
std::vector<
int
> out;
10.
std::iota(rng.begin(), rng.end(), 1);
11.
12.
while
(rng.size() > 0) {
13.
i = (i - 1 + p) % rng.size();
14.
out.push_back(rng[i]);
15.
rng.erase(rng.begin() + i);
16.
}
17.
return
out;
18.
}
19.
20.
int
main() {
21.
auto jos{ Josephus(8, 5) };
22.
for
(
const
auto& j : jos) {
23.
std::cout << j <<
", "
;
24.
}
25.
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme: (ansehen)
n=7, p=4 -> 4, 1, 6, 5, 7, 3, 2
n=8, p=5 -> 5, 2, 8, 7, 1, 4, 6, 3
Kommentare (4)
Ich habe die Aufgabe dahingehend abgeändert. Nummerierte Personen behalten hier ihre ursprüngliche Nummern (Wie beim Skirennen oder beim Marathon).
Wenn wir es so handhaben, dann ergibt sich auch immer eine Permutation, also eine Vertauschung der Nummern, ohne dass neue Nummern hinzukommen oder verschwinden.
Besten Dank für den Hinweis.
Ja klar, besten Dank für den Hinweis, habe es eben korrigiert.
Gruß
philipp