鱼C论坛

 找回密码
 立即注册
查看: 9863|回复: 59

[技术交流] Python:每日一题 14

[复制链接]
发表于 2017-3-31 19:34:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 新手·ing 于 2017-3-31 19:36 编辑

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

如果你认真答题,会得到鱼币奖励!!!
                      如果你认真答题,会得到鱼币奖励!!!
                                              如果你认真答题,会得到鱼币奖励!!!


欢迎小伙伴们,一起答题!
如果你有能力,欢迎加入我们!
已经上车老司机:@ooxx7788 @lumber2388779   
点我上车
[hide]if __name__ == '__main__':
    nmax = 50
    n = int(input('请输入总人数:'))
    num = []
    for i in range(n):
        num.append(i + 1)

    i = 0
    k = 0
    m = 0

    while m < n - 1:
        if num[i] != 0 : k += 1
        if k == 3:
            num[i] = 0
            k = 0
            m += 1
        i += 1
        if i == n : i = 0

    i = 0
    while num[i] == 0: i += 1
    print(num[i])
[/hide]

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
gopythoner + 1 + 1 你这个系列还挺不错的,我已经订阅了,准备.

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-31 19:36:43 | 显示全部楼层
@lumber2388779 @ooxx7788 @jerryxjr1220 @冬雪雪冬
来吧(刚才不小心删了...我错了...)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 22:04:48 | 显示全部楼层
重新发了。
num = int(input('多少人围成一圈:'))
list1 = list(range(1, num + 1))
n = 2
while len(list1) > 1:
    list1.pop(n)
    n = (n + 2) % len(list1)
print('最后留下的是原来第%d号'%list1[0])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-31 23:13:33 | 显示全部楼层
def get_num(n):
    if n == 1:
        print (1)
    else:
        dic = {}
        for i in range(1,n+1):
            dic[i] = i
        for n in range(1,len(dic)-1):
            for x in dic:
                if dic[x]>=3:
                    dic[x] = dic[x] -3
                elif dic[x] == 0:
                    dic[x] = dic[x]
                else:
                    dic[x] = dic[x]+(len(dic)-2-n)
        for a in dic:
            if dic[a] ==2:
                print (a)

if __name__ == '__main__':
    get_num(1000)

我也写了一个函数,测试了一下有1000个人的时候是第604
跟楼上2位的结果一样

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
新手·ing + 1 + 1 一回来就一直给你发鱼币...

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 23:14:49 | 显示全部楼层

你这个有点6了,很简约
我分析了半天也才写出来一个比你这长2倍的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 23:21:31 | 显示全部楼层
gopythoner 发表于 2017-3-31 23:14
你这个有点6了,很简约
我分析了半天也才写出来一个比你这长2倍的

又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:
num = int(input('多少人围成一圈:'))
list1 = list(range(1, num + 1))
n = 2 % len(list1)
while len(list1) > 1:
    list1.pop(n)
    n = (n + 2) % len(list1)
print('最后留下的是原来第%d号'%list1[0])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-1 00:27:06 | 显示全部楼层
约瑟夫环问题,貌似在我的小练习中已经写过了
http://bbs.fishc.com/thread-81150-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-1 08:52:31 | 显示全部楼层
换一种思路:
研究一下,人数从1到20,最后留下的是
1 1
2 2
3 2
4 1
5 4
6 1
7 4
8 7
9 1
10 4
11 7
12 10
13 13
14 2
15 5
16 8
17 11
18 14
19 17
20 20
发现如下规律,下一行为前面的+3,如果超过人数的值则减去人数。
写了1-20人的程序,为了方便,把列表的第0个给值为0
num = 1
list1 = [0, 1]
for num in range(2, 21):
    list1.append((list1[num -1] + 2) % num + 1)
for i, j in enumerate(list1):
    print(i, j)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-1 18:01:29 | 显示全部楼层
冬雪雪冬 发表于 2017-3-31 23:21
又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:

支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-1 18:01:56 | 显示全部楼层
冬雪雪冬 发表于 2017-4-1 08:52
换一种思路:
研究一下,人数从1到20,最后留下的是

学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-3 12:58:01 | 显示全部楼层
#coding=cp936
count=1
#设置一个计数器用于报数
def fun(x):
        global count
        #Python2当函数内需要对全局变量赋值时需要先声明
        if len(x)==1:
                print x
        #退到只剩1个人的时候就能知道答案
        else:
                for i in x:
                        if count==3:
                                n=x.index(i)
                                x[n]='a'
                                count=1
                        #当报数到3时将该人赋值为a,并重置计数器
                        else:
                                count+=1
                        #没报到3就下一个
                for i in x:
                        if i=='a':
                                del x[x.index(i)]
                        #将变成3的人统统消灭
                fun(x)
                        #数组已经改变了,重新调用一次函数
n=input('请输入人数:')
array=range(1,n+1)
fun(array)        

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4 思路很清晰,支持!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 2017-4-10 18:59:25 | 显示全部楼层
n = int(input('请输入n的值:'))
arr = list(range(1,n+1,1))
i = 1
m = 0
while len(arr)>1:
    #print('m',m,'i',i)
    if i == 3 and m < len(arr):
        arr.pop(m)
        i = 1
        continue
    elif m > len(arr)-1:
        m = 0
        continue
    m += 1
    i += 1
print(arr)

跟冬雪第二种思路一样,第一种思路有点想不通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 19:08:27 | 显示全部楼层
lumber2388779 发表于 2017-4-10 18:59
跟冬雪第二种思路一样,第一种思路有点想不通

不给版主奖励~谢谢支持~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 19:12:02 | 显示全部楼层
新手·ing 发表于 2017-4-10 19:08
不给版主奖励~谢谢支持~

没事我是迟来的,最近有点忙
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 19:24:48 | 显示全部楼层
lumber2388779 发表于 2017-4-10 19:12
没事我是迟来的,最近有点忙

没事支持就好~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-30 20:56:51 | 显示全部楼层
OMG···只有我递归了吗?n到了6位数开始卡了
def filter_out(n):  # 传入正整数n
    lst = list(range(1,n+1))
    start = 0
    def cal(lst, mod):
        """闭包中,lst是剩余的人的列表,mod是每一圈从哪开始的信息"""
        if len(lst) == 1: 
            print('留下的是第 %d 个' % lst[0])
        else:
            num = (len(lst) +mod)%3   # 每轮初始算上前一轮余下的,这是当前一轮余数
            new_lst = list(filter(lambda x: x not in lst[2-mod::3], lst)) # 逢3过滤
            return cal(new_lst, num)
    return cal(lst, start)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-1 22:00:16 | 显示全部楼层
n = int (input("Please input n:"))
temp = []
for i in range (n):
    temp.append (i+1)
while n>1:
    for i in range (3):
        a = temp[0]
        temp.remove(a)
        if i!=2:
            temp.append(a)
    n -= 1
print (temp[0])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-1 14:59:35 | 显示全部楼层
num=int(input('请输入人数'))
list1=list(range(1,num+1))
n=2
while len(list1)>1:
  list1.pop(n)
  n=n+2
  if n>=len(list1):

    n=(n-len(list1))
    if n >= len(list1):
        n = (n - len(list1))

print(list1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 21:48:34 | 显示全部楼层
冬雪雪冬 发表于 2017-3-31 23:21
又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:

厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-15 10:37:02 | 显示全部楼层
L = [int(x+1) for x in range(int(input('输入一个数字:')))]
count = 0
while len(L)!= 1:
    j = 0
    length = len(L)
    for i in range(length):
        count+=1
        if count == 3:
            del L[i-j]
            j+=1
            count = 0
        if len(L) == 1:
            print(L)
            break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 15:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表