试题 算法训练 筛选号码 python 2020.3.14

试题 算法训练 筛选号码

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。
  问最后留下的是原来第几号的那位。
  举个例子,8个人围成一圈:
  1 2 3 4 5 6 7 8
  第1次报数之后,3退出,剩下:
  1 2 4 5 6 7 8 (现在从4开始报数)
  第2次报数之后,6退出,剩下:
  1 2 4 5 7 8 (现在从7开始报数)
  第3次报数之后,1退出,剩下:
  2 4 5 7 8 (现在从2开始报数)
  第4次报数之后,5退出,剩下:
  2 4 7 8 (现在从7开始报数)
  第5次报数之后,2退出,剩下:
  4 7 8 (现在从4开始报数)
  第6次报数之后,8退出,剩下:
  4 7 (现在从4开始报数)
  最后一次报数之后,4退出,剩下:
  7.
  所以,最后留下来的人编号是7。
输入格式
  一个正整数n,(1<n<10000)
输出格式
  一个正整数,最后留下来的那个人的编号。
样例输入
8
样例输出
7
数据规模和约定
  对于100%的数据,1<n<10000。

解决办法
这是个约瑟夫问题,在网上查了很多办法这里编写两种
1.报数挨个删除
注意索引值

n = int(input())
arr = [int(j+1) for j in range(n)]
i = 0
count = 0

while len(arr) != 1:   
        count += 1
        if i >= len(arr):
            i = 0
        if count == 3: #计数到三删除
           del arr[i]
           count = 0
           i -= 1
        i += 1        
print(arr[0])

2.用数学方法解决问题
递归的方法,理解较困难

# 数学方法解决 约瑟夫环
n = int(input())
def f(n,m):
    
    if(n == 1):
        return 0
    return (f(n - 1,m) + m) % n
print(f(n,3)+1)

参考的是用Java做的,里边数学方法讲的挺详细,可以参考https://www.jianshu.com/p/eeb696037bfc

正在学习中,有参加蓝桥杯的可以一起学习

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值