仕事
リストを使用してジョセフの指輪を解く問題を書く
バックグラウンド
有名なユダヤ人の歴史家ヨセフスには次のような話があると言われています。ローマ人がチョタパットを占領した後、39人のユダヤ人がヨセフスと彼の友人たちと一緒に洞窟に隠れました。
39ユダヤ人は、敵に捕まるよりも死ぬほうがよいと判断しました。そこで、自殺の方法を決めました。41人が輪になって、1人目がカウントを報告し始めました。3人目がカウントされるたびに、その人は自殺しなければなりません。その後、全員が自殺するまで次のカウントが再報告されます。しかし、ヨセフスとその友人たちは従いたくなかったので、ヨセフスは友人たちに最初に従うふりをするように頼み、友人と自分自身を16位と31位に配置したので、デスゲームから逃れました。
ヨセフスの問題は次のように説明できます。n人に1、2、3、...、nの番号が付けられ、順番に円を描くように座ります。1、2、3、...、mに従って番号の報告を開始すると、mに報告するすべての人が一覧表示されます。みんなが出かけるまで。
解決する
方法1
リストの先頭からトラバーサルを開始し、カウンターをc
設定し0
、設定をに初期化します。判定されるたびに、判定カウンターになります。c==k(设置的序号)
現在の番号を削除する必要がある場合は、削除後にカウンターが戻ります0
。トラバーサル継続しc
ますが、最初からカウントを開始します。具体的なアイデアを次の図に示します。
x=[]
n=eval(input("输入人数"))
k=eval(input("输入序号"))
x = [i for i in range(1,n+1)]
c = 0
# 当x不为空时进行循环
while x:
temp = x[0]
c = c + 1
if c == k:
print(temp)
c = 0
x.remove(temp)
else:
x.remove(temp)
x.append(temp)
方法II
最初の方法はそれをまっすぐなリストと考えることであり、トラバーサルは常に継続し、2番目の方法は円を描くことであり、トラバーサルはリストの最初から最後に到達したときに開始します。
サイクルインデックスindex
は0
最初から始まり、リストに最後の要素しかないときに終了します。
リストから削除された最初の要素インデックスlen
は、現在のリストの長さを示します。リストから削除された(0+(k-1))%len
2番目の要素インデックス:(0+(k-1)+(k-1))%len
実際には、毎回です。配列内の削除された要素の位置index = (index + (k-1))%len
2つの注意点:
为什么要%len?
ループトラバーサルであるため、番号1、番号2、番号3など、最初から最後まで続行する必要があり、番号が順番に報告され、番号が繰り返されます。 、そして5番を報告した人は2番です。
为什么是index+(k-1)?
将来的にはkの数になりますが、前の段階で要件を満たす要素が1つ削除されたため、後の段階で要件を満たす要素の添え字は実際にはk-1だけ増加します。
x=[]
n=eval(input("输入人数"))
k=eval(input("输入序号"))
x = [i for i in range(1,n+1)]
index = 0
while True:
if len(x) == 1:
print(x[0])
break
index=(index+(k-1))%len(x)
print(lb[x])
del lb[x]