N种方法实现约瑟夫报数问题

这是一个关于编程实现的循环报数游戏,玩家按1-3的顺序报数,报到3的人出局,直到只剩下最后一个人。文章通过不同的代码实现方式展示了游戏过程,包括使用列表操作和循环迭代,以及利用`itertools.cycle`等工具。
摘要由CSDN通过智能技术生成

输入报数游戏总人数n(n为正整数),给每人按1-n的顺序进行编号,依次报数(1-3循环报数),但凡报到3的人退出,程序输出最终留下的人的编号是

n = int(input("请输入总人数:"))
circle = list(range(1,n+1))
num = 1
i = 1
while len(circle) != 1:
    circle.append(circle.pop(0))
    num +=1
    if num ==3:
        del circle[0]
        num = 1
        i += 1
print("最后留下的人是原来的:",circle.pop(),"号")

from itertools import  cycle

def game(lst,k):
    #切片
    a = lst[:]
    #游戏一直进行到只剩最后一个人
    while len(a)>1:
        c = cycle(a)
        #baoshu
        for i in range(3):
            t = next(c)
        #chuju_one person,
        index = a.index(t)
        a=a[index+1:]+a[:index]
        print(a)
    #game finish
    return a[0]
lst=list(range(1,11))
pNum= int(input("请输入总人数"))
lst=list(range(1,pNum+1))
print("最后留下来的是原来的",game(lst,3))
    
n = int(input("请输入总人数:"))
k = 3
alist=[]
for i in range(1,n+1):
    alist.append(i)
t=1
i=1
while n>1:
    t=t+k-1
    if t>n:
        t=t%n
    i = i + 1
    del alist[t-1]
    n=n-1
print("最后留下来的是原来的:",alist[0],"号")
n = int(input("输入游戏总人数n:"))

if n == 1:
    print("就一个人,当然剩下1号咯")
elif n == 2:
    print("最终留下来的是原来的:2号")
else:
    List = []
    for i in range(n):
        List.append(i+1)
    
    baoshu = 0
    test = "   "
    while len(test)>2:
        for i in range(len(List)):
            if List[i]!= 0:
                baoshu +=1
            if baoshu ==3:
                List.pop(i)
                List.insert(i,0)
                baoshu = 0
        test = set(List)
    
    for i in test:
        if i!=0:
            print('最终留下来的是原来的:',i,'号')

n=int(input())
li=list(range(1,n+1))
c=0
while len(li)>1:
        lio=li[:]
        for i in range (0,len(lio)):
            c=c+1
            if c%3==0:
                li.remove(lio[i])

print(li[0])
zong = int(input('请输入总人数:')) 
xu = [] 
for i in range(zong): 
    xu.append(i + 1) 
i = 0 
k = 0 
m = 0 
while m < zong - 1: 
    if xu[i] != 0:  
        k += 1 
    if k == 3: 
        xu[i] = 0 
        k = 0 
        m += 1 
    i += 1 
    if i == zong:  
        i = 0 
i = 0 
while xu[i] == 0:  
    i += 1 
print('最后留下来的是原来的:', xu[i], '号')
def game(begin,k):
    num = int(input("请输入总人数:"))
    List = list(range(1,num+1))
    
    out = begin - 1
    for i in range(num-1):
        out = (out + k - 1) %len (List)
        List.pop(out)
        
    print("最后留下来是原来的",List[0],"号")
    
game (1,3)
n = 10
nlist = []
for i in range(1,n+1):
    nlist.append(i)
print(nlist)
a = 1
b = 1
while len(nlist)>1:
    for i in nlist:
        if a%3==0:
            nlist.remove(i)
            print("第{}回合:现有编号学员{},被删除学员编号{}".format(b,str(nlist),i))
        a+=1
print(nlist)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值