精华内容
下载资源
问答
  • 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几位。 案例实现 为方便大家理解,我详细说明一些函数的引用。如果觉得没必要,直接跳到最后代码页即可。...

    引语

    记录学习路程,抛砖引玉。如有更好的算法或者出现错误,欢迎指点。

    题目

    有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几位。

    案例实现

    为方便大家理解,我详细说明一些函数的引用。如果觉得没必要,直接跳到最后代码页即可。
    以下是我解题思路(假设有6个人):

    1. 建立列表former,然后把1~6六个元素添加到列表former中(用了range函数和append函数)
    2. 把former列表的第一个元素赋值给later然后移除(用了pop函数)
    3. 起一个变量count来判断每次移除的首元素是否整除3,如果不整除就重新给回给列表former(用了append函数,实现了围成一圈的首尾相连),如果整除的话就让他滚蛋退圈
    4. 最后判断列表former长度为1(即其剩下一个元素)时,打印列表former元素(最后剩下的元素是1)
      在这里插入图片描述
    former = [] 
    count = 0 
    for i in range(1,7): 
        former.append(i)
    while True: 
        if len(former) == 1: 
            break
        else: 
            count += 1 
            later = former[0] 
            former.pop(0) 
            if count == 3: 
                count = 0 
                continue 
            else: 
                former.append(later) 
    print(former) 
    """
    [1]
    """
    

    range()函数

    对于 range() 函数,有几个注意点:
    (1)它表示的是左闭右开区间;
    (2)它接收的参数必须是整数,可以是负数,但不能是浮点数等其它类型;
    (3)它是不可变的序列类型,可以进行判断元素、查找元素、切片等操作,但不能修改元素;
    (4)它是可迭代对象,却不是迭代器。

    a=list(range(6))#默认从0开始
    b=list(range(1,6))#左闭右开没有6
    c=list(range(1,15,2))#左闭右开没有15,2为等差
    print(a)
    print(b)
    print(c)
    """
    [0, 1, 2, 3, 4, 5]
    [1, 2, 3, 4, 5]
    [1, 3, 5, 7, 9, 11, 13]
    """
    

    为什么上面6个人案例的代码是range(1,7)呢~现在是不是茅塞顿开了呢^^

    append()函数

    在处理这个案例上运用这个函数实现了在数组列表后添加上相应的元素

    c=list(range(1,15,2))
    print(c)
    c.append(19)
    print(c)
    """
    [1, 3, 5, 7, 9, 11, 13]
    [1, 3, 5, 7, 9, 11, 13, 19]
    """
    

    pop()函数

    是的没错,最后介绍的就是移除,也是灭掉这个案例的大招。小例题如下,自己细品。

    a1=list(range(6))
    b1=list(range(1,6))
    c1=list(range(1,15,2))
    print(a1)
    a=a1.pop(5)
    print(a)
    print(a1)
    print("***************")
    print(b1)
    b=b1.pop(0)
    print(b)
    print(b1)
    print("***************")
    print(c1)
    c=c1.pop(3)
    print(c)
    print(c1)
    

    执行结果如下:

    [0, 1, 2, 3, 4, 5]
    5
    [0, 1, 2, 3, 4]
    ***************
    [1, 2, 3, 4, 5]
    1
    [2, 3, 4, 5]
    ***************
    [1, 3, 5, 7, 9, 11, 13]
    7
    [1, 3, 5, 9, 11, 13]
    

    完整代码

    说了一大堆,其实也就是几行代码而已…

    n = int(input("请输入有几个人围圈:"))
    former = [] # 创个空列表
    count = 0 #用来计数
    for i in range(1,n+1): #把元素1~n顺序放入列表,再提一次,左闭右开所以是n+1
        former.append(i)
    while True: 
        if len(former) == 1: # 如果列表的长度为1,结束收工
            break
        else: 
            count += 1 # 记数加1
            later = former[0] #取出列表当中的第一个元素,并赋值给later
            former.pop(0) #移除列表当中的第一个元素
            if count == 3: # 整除3的话续列没你份,赶紧滚蛋
                count = 0 
                continue 
            else: 
                former.append(later) #把不整除3的续入列表former后面
    print("最后剩下的是第",former,"位") # 最后打印出剩余的那个仔
    

    运行结果如下(假设有100人围圈):

    请输入有几个人围圈:100
    最后剩下的是第 [91]
    展开全文
  • # n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位。 n = int(input("please set the number of players:")) game = [] for i in range(n...
    # n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位。
    n = int(input("please set the number of players:"))
    game = []
    for i in range(n):
        game.append(i + 1)
    sign = 0
    order = 0
    out_players = 0
    while out_players < n - 1:
        if game[order] != 0:
            sign += 1
        if sign == 3:
            game[order] = 0
            out_players += 1
            sign = 0
        order += 1
        if order == n: order = 0
    for i in range(n):
        if game [i] != 0:
            print("It is player" + str(i + 1))
    
    展开全文
  • # 有n个人围成一圈,顺序排号。 # 从第一个人开始报数(从1到3报数), # 凡报到3的人退出圈子, # 问最后留下的是原来第几号的那位 n = int(input("请输入总人数:")) n_list = [] a = -1 flag = True for i in ...
    # 题目:
    # 有n个人围成一圈,顺序排号。
    # 从第一个人开始报数(从1到3报数),
    # 凡报到3的人退出圈子,
    # 问最后留下的是原来第几号的那位
    n = int(input("请输入总人数:"))
    n_list = []
    a = -1
    flag = True
    
    for i in range(1, n + 1):
        n_list.append(i)
    
    while flag:
        for j in range(3):
            if len(n_list) == 1:
                print(n_list[0])
                flag = False
                break
            if a == len(n_list) - 1:
                a = -1
            a += 1
            if j == 2:
                n_list.remove(n_list[a])
                a -= 1
    
    

    或者

    n=int(input("请输入总人数:"))
    m=int(input("请规定报到数字几的人退出圈子:"))
    circle=[]
    for i in range(1,n+1):
        circle.append(i)
    num=1
    while len(circle)!=1:
        circle.append(circle.pop(0)) #把已报数的人取出放到队尾,以此实现围成圈循环往复
        num+=1
        if num==m:
            del circle[0]
    

    汉诺塔问题

    def hanoi(n, a, b, c):
        if n>0:
            hanoi(n-1, a, c, b)
            print('moving from %s to %s'%(a,c))
            hanoi(n - 1, b, a, c)
    
    hanoi(4, 'A', 'B', 'C')
    
    
    def func(n):
        # 给递归一个出口  第一位和第二位都是1
        if n == 1:
            return 1
        if n == 2:
            return 3
        else:
            # 从第三位开始  返回上一个数加上上一个数
            return 2*func(n-1) + 1
    res = func(64)
    print(res)
    
    
    展开全文
  • /usr/bin/python shoplist=['mango','apple','carrot','banana','oracle','python'] length = len(shoplist) global n for i in range(length,1,-1): if i==6: n = shoplist.index(shoplist...
    #!/usr/bin/python
    
    
    shoplist=['mango','apple','carrot','banana','oracle','python']
    length = len(shoplist)
    
    global n
    
    for i in range(length,1,-1):
      if i==6:
        n = shoplist.index(shoplist[3])
        shoplist.remove(shoplist[n])
        print n
        continue
      if n+3>i:
        n=n+3-i-1
        shoplist.remove(shoplist[n])
        print n
        continue
      if n+3<i:
        n=n+3-1
        shoplist.remove(shoplist[n])
        print n
        continue
        
    print shoplist


     

    转载于:https://www.cnblogs.com/sherlockhomles/p/4882810.html

    展开全文
  • 有n个人围成一圈,从0到n-1按顺序编号,从第一个人开始从1到k报数,报到k的人推出圈子,然后圈子缩小,从下个人继续游戏,问最后留下来的是几号? from itertools import cycle def demo(people, k): # 报数报到k的...
  • 自己写的,是利用列表 仿照报数过程个把人踢出去最后得到结果: count = int(raw_input('Please input the count:')) li = [] for i in range(count): li.append(i+1) times = count/3 +2 count_tial = 0 ...
  • 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 代码一: n=int(input('输入数字:'))#输入数字 a=list(range(1,n+1))#建立一个列表,存放...
  • 有n个人围成一圈,顺序编号。从第1个人开始报数(从1-3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位? java代码如下: int n = 10;//n的取值 int num = n;//记录剩余数个数 int arr[] = new int...
  • 加循环但是不能排序 #include int main() { int a[10] = { 0,1,2,3,4,5,6,7,8... int i = 0, j = 0, n = 0, m, h = 10, r, s, t; for (r = 5; r > 0; r--) { i = 0; j = 0; m = 2; while (j ) { a[i++]
  • https://www.cnblogs.com/xtuxiongda/p/8295690.html #include<stdio.h> int main() { int a[100]; int n; int i,j; scanf("%d",&n); j=n; for(i=0;i<n;i++) a[i]=...
  • 若干个人(设为N围成一圈,每人依次编号,从第一个人开始报数,报到3的人出列,下一个人接着从1开始报数,周而复始,直到最后一人。 问最后这个人的编号是多少? 今天想着用Python把它实现出来,代码如下: ##...
  • 看了挺多博客感觉都挺复杂的,自己写这个自认为比较简单,也更灵活,希望可以帮到需要的人,... circle.append(circle.pop(0)) #把已报数的人取出放到队尾,以此实现围成圈循环往复 num+=1 if num==m: del circle[0]
  • # 有n个人围成一圈,顺序排号。 # 从第一个人开始报数(从1到3报数), # 凡报到3的人退出圈子, # 问最后留下的是原来第几号的那位。 n = int(input("请输入总人数:")) n_list = [] a = -1 flag = True for i in...
  • 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数), 凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 代码: package work; import java.util.ArrayList; public class Main{ /** * ...
  • num = int(input("请输入人数n(n>0):")) L = list(range(1, num + 1)) def reserve(L, num): if num == 1 or num == 2: return L[num - 1] else: index = num % 3 m = num // 3 f
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 题目:n个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。 如果你想成为最后两个幸运儿,请问开始时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,330
精华内容 932
关键字:

python有n个人围成一圈

python 订阅