问:

【基础题】:有 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. Exceptionless - 本地搭建

    搭建环境:Windows 10 参与文档:https://github.com/exceptionless/Exceptionless/wiki/Self-Hosting 运行环境: .NET 4.6 ...

  2. 1 js中常用的操作

    总结一些前端js常用的操作 常用日期操作:前端开发常用 JS 方法 js中array.list.map的遍历:js遍历集合(Array,Map,Set) js中对象的定义:js创建自定义对象的几种方式 ...

  3. 秋招打怪升级之路:十面阿里,终获offer!

    本文转载自:https://gongfukangee.github.io/2019/09/06/Job/ 作者:G.Fukang 开源项目推荐: JavaGuide: Java学习+面试指南!Gith ...

  4. c#导出数据到csv文本文档中,数据前面的0不见了解决方法

    ((char)(9)).ToString() + dataRow["FUserName"].ToString().Trim() + "\t",

  5. kubernetes学习之service、deployment、pod的关系

    deployment根据Pod的标签关联到Pod,是为了管理pod的生命周期 service根据Pod的标签关联到pod,是为了让外部访问到pod,给pod做负载均衡 需要注意: deployment ...

  6. 设置 Jupyter notebook 工作空间 / 默认路径

    常用的启动 Jupyter notebook 的两种方式是:命令行窗口启动和开始菜单启动.设置 Jupyter notebook 的默认路径也有两种常用方式: 修改配置文件 设置快捷方式. 1 通过修 ...

  7. MobiSystems OfficeSuite 3.60.27307

    官网:https://www.mobisystems.com/ 或 https://www.officesuitenow.com/cn/ MobiSystems OfficeSuite 3.60.27 ...

  8. hexo 搜索功能

    搜索功能真心好用,当文章多起来的时候,标签提供的作用已经很少了,只能简单索引,搜索却能精确查找,这里我用的依旧是最简单的本地站内搜索. 安装插件 npm install hexo-generator- ...

  9. 文件转换神器pandoc

    pandoc  :可以在各种文件之间进行相互转化.比如从md文件转为pdf,docx转为tex文件,html文件和txt文件相互转化,等等. 在终端启用命令行执行命令. 我最近要完成的任务是把有很多个 ...

  10. WPF 用户控件的自定义依赖属性在 MVVM 模式下的使用备忘

    依赖属性相当于扩充了 WPF 标签的原有属性列表,并可以使用 WPF 的绑定功能,可谓是十分方便的:用户控件则相当于代码重用的一种方式:以上几点分开来还是比较好理解的,不过要用到MVVM 模式中,还是 ...