问:

【基础题】:有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数) ,凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位。 (n由键盘输入,比如n=100)

【提高题】:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

答:

【基础题】:有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数) ,凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位。 (n由键盘输入,比如n=100)

方法1:

n = int(input("输入参与人数:"))
steps, num_list,kill_num_list = 3, list(map(int, list(range(1, n + 1)))), []
step, num_list_bk = steps - 1, num_list[:] def ysfh(steps):
global num_list, step
out_number = num_list[step]
kill_num_list.append(out_number)
print("{} was killed!".format(out_number))
print(num_list)
print(step)
step = step + steps
while step >= len(num_list):
step -= len(num_list)
num_list = list(set(num_list)-set(kill_num_list))
num_list.sort()
else:
if len(num_list) == 1:
pass
else:
ysfh(steps) ysfh(steps)
print("最后一个存活的是{}号".format(num_list_bk.index(num_list.pop(0))+1))

方法2:

num = int(input('请输入共多少人:'))
# 将所有人放入一个数组
list_count = list(range(1, num + 1))
# 设置一个变量,用于计算报数
count = 0
while len(list_count) > 1: # 当数组中至少有2个元素时进行循环
list_count_new = list_count[:] # 把原数组拷贝到新数组中,用于限制内层循环次数
for i in range(0, len(list_count_new)): # 内层循环开始,从第一个人开始报数
count = count + 1 # 每报一次,count计数器加1

if count % 3 == 0: # 如果count能被3整除,则是报到3的人
print('第 {} 号淘汰'.format(list_count_new[i]))
list_count.remove(list_count_new[i]) # 把报到3的人移除原数组,进行下一次循环

print('最后留下的是原来的第 {} 号'.format(list_count[0]))

方法3:

n = input('请输入人数')
circle = list(range(1,int(n) + 1))
i = 0
count = 1
while len(circle) > 1:
if count == 3:
print(f'{circle[i]}出队')
del(circle[i])
count = 1
i = (i + 1) % len(circle)
count += 1
print(f'最后出队的是{circle[0]}')

方法4:

n = input('请输入人数')
circle = list(range(1,int(n) + 1))
i = 0
count = 1
while len(circle) > 1:
if count == 3:
print(f'{circle[i]}出队')
del(circle[i])
count = 1
i = (i + 1) % len(circle)
count += 1
print(f'最后出队的是{circle[0]}')

方法5:

def circulation(peopleNumber):
lic = list(range(1, peopleNumber+1))
count = 0
while len(lic) >1:
lico = lic[:]
print(lico)
for i in range(0, len(lico)):
count = count+1

if count % 3 == 0:
lic.remove(lico[i])
print(lic)


if __name__ == "__main__":
peopleNumber = int(input('请输入有多少人:'))
circulation(peopleNumber)

【提高题】:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

方法1:

rest = 4
while True:
flag = 1
sum = rest
for i in range(5):
if sum % 4 != 0:
flag = 0
break
sum = sum * 5.0 / 4 + 1
if flag == 1:
break
else:
rest += 4
print(f'最少有{int(sum)}个')

方法2:

# 本算法从最后一个猴子进行逆向推倒
def peach(monkey=5):
pea = 4 # 最后一个猴子分完剩余的桃子
while 1:
num = pea
for i in range(monkey):
num = num + num / 4 + 1
if num % 1 != 0: # 如果分出了小数则结束内层循环
pea += 4 # 最后的桃子一定是4的整数倍
break
if num % 1 == 0: # 如果是整分 则结束
break
return pea, num


if __name__ == '__main__':
pea, num = peach()
print(pea, num)

方法3:

# 输入猴子数量
monkey = int(input("Input monkey num:"))


# 定义桃子总数函数
def show(n):
# 循环次数
for i in range(1, monkey+1):
# 下一只猴子应该带走的桃子数
t = (n - 1) / monkey
# 格式化输出
print(u'%d. 桃子有%d个, 第%i只猴吃1个, 拿走%s个。' % (i, n, i, t))
# 前一只猴子带走一份桃子后剩余的桃子总数
n = (monkey-1) * t


# 定义功能函数
def fun():
# 从1开始
k = 1
while True:
t = k
# 循环次数
for i in range(monkey-1):
# 当前猴子应拿走桃子数为tc,吃拿之前总量应为 monkey * tc + 1,前一个猴子拿走桃子数为tp,则有 (monkey-1) * tp = monkey * tc + 1
t = monkey * t + 1
# 在for循环中含有break时则直接终止循环,不执行else
if t % (monkey-1): break
t /= (monkey-1)
# 当迭代的对象迭代完并为空时,位于else的子句将执行,即找到符合条件最小整数
else:
print('如果猴子%d只:' % monkey)
print('桃子总数要%d个:' % (monkey * t + 1))
show(monkey * t + 1)
break
k += 1


if __name__ == '__main__':
fun()

Python【每日一问】31的更多相关文章

  1. [python每日一练]--0012:敏感词过滤 type2

    题目链接:https://github.com/Show-Me-the-Code/show-me-the-code代码github链接:https://github.com/wjsaya/python ...

  2. Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词

    #coding:utf-8 import os,re path = 'test' files = os.listdir(path) def count_word(words): dic = {} ma ...

  3. python每日一函数 - divmod数字处理函数

    python每日一函数 - divmod数字处理函数 divmod(a,b)函数 中文说明: divmod(a,b)方法返回的是a//b(除法取整)以及a对b的余数 返回结果类型为tuple 参数: ...

  4. 每日一问:Android 消息机制,我有必要再讲一次!

    坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 我 17 年的 面试系列,曾写过一篇名为:Android 面试(五):探 ...

  5. 每日一问:谈谈 volatile 关键字

    这是 wanAndroid 每日一问中的一道题,下面我们来尝试解答一下. 讲讲并发专题 volatile,synchronize,CAS,happens before, lost wake up 为了 ...

  6. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  7. 每日一问:你了解 Java 虚拟机结构么?

    对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员 ...

  8. 每日一问:LayoutParams 你知道多少?

    前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的.我们 ...

  9. 每日一问:简述 View 的绘制流程

    Android 开发中经常需要用一些自定义 View 去满足产品和设计的脑洞,所以 View 的绘制流程至关重要.网上目前有非常多这方面的资料,但最好的方式还是直接跟着源码进行解读,每日一问系列一直追 ...

  10. python每日一练:0007题

    第 0007 题: 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来. # -*- coding:utf-8 -*- import os def count ...

随机推荐

  1. 项目中使用Redis的游标scan的一些小问题

    最近项目中有一个需求就是在下拉中要筛选车辆列表,本来想着是在内存中全部用程序去遍历处理,但发现数据有点多,一个个去处理会有点慢.然后就找到了redis的游标 感觉这个能满足我的需求,我可以把key存成 ...

  2. 设计模式之(十二)享元模式(Flyweight)

    享元模式思想 就以小时候导锅来说吧(导锅是我家乡的方言,就是用细沙把一个模型锅的形状拓下来,然后把铝水倒进模型中,就导好一个锅了.小时候很喜欢看的,可惜现在看不到了.上个图片回忆下)了解了这个过程后就 ...

  3. Invalid attempt to spread non-iterable instance

    问题在于对数据的操作,或数据类型,或数据名称

  4. 记录Mac OS下编译Thrift库

    方法一:brew管理工具安装Homebrew是Mac开发包管理工具,类似于Linux的apt-get之类的,实它相当于开发软件界的 Appstore.借助该管理工具,可以自动化地安装软件包,它会自动安 ...

  5. Kubernetes概念之RC

    感觉自己浪费了一年的时间,种一棵树最好的时间是十年前,还有就是现在,虽然这颗树种了又种,种了又种,这次真的要种了......   本文通过<Kubernetes权威指南>的概念部分学习总结 ...

  6. C# 连接数据操作的时候抛异常,连接超时

    先说说我的业务.我在发送优惠券的时候,同时给6千多个会员发送优惠券,执行了update 和insert语句,这写语句都是通过字符串拼接而来的.update和insert语句加起来一共是一万多条语句.在 ...

  7. unity点击按钮弹出操作提示界面

    1.首先在相应的位置添加一个(UGUI控件)image,在image下添加文本框和按钮设计弹出框内容如图: 2.新建C#脚本UITips using System.Collections; using ...

  8. Linux shell 函数应用示例01

    函数Function的使用 定义函数 (1) 函数名称() {     ...     ... } (2) function 函数名称{     ...     ... } 调用函数         ...

  9. Linux用户权限管理

    Linux操作系统: 多用户多任务的操作系统 用户类型分为:     管理员用户 : root     普通用户分为:系统用户/程序用户 用户相关的文件:     /etc/passwd      用 ...

  10. 查看 Python 对象的属性

    1 .dir函数可以返回一个对象的所有属性和方法. 示例:查看 int 对象的属性和方法 示例: 查看 dict 对象的属性和方法 标红的这些是不是遇到过? 2.help()调用内置帮助系统 示例 3 ...