Python【每日一问】31
问:
【基础题】:有 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的更多相关文章
- [python每日一练]--0012:敏感词过滤 type2
题目链接:https://github.com/Show-Me-the-Code/show-me-the-code代码github链接:https://github.com/wjsaya/python ...
- Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词
#coding:utf-8 import os,re path = 'test' files = os.listdir(path) def count_word(words): dic = {} ma ...
- python每日一函数 - divmod数字处理函数
python每日一函数 - divmod数字处理函数 divmod(a,b)函数 中文说明: divmod(a,b)方法返回的是a//b(除法取整)以及a对b的余数 返回结果类型为tuple 参数: ...
- 每日一问:Android 消息机制,我有必要再讲一次!
坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 我 17 年的 面试系列,曾写过一篇名为:Android 面试(五):探 ...
- 每日一问:谈谈 volatile 关键字
这是 wanAndroid 每日一问中的一道题,下面我们来尝试解答一下. 讲讲并发专题 volatile,synchronize,CAS,happens before, lost wake up 为了 ...
- 每日一问:讲讲 Java 虚拟机的垃圾回收
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...
- 每日一问:你了解 Java 虚拟机结构么?
对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员 ...
- 每日一问:LayoutParams 你知道多少?
前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的.我们 ...
- 每日一问:简述 View 的绘制流程
Android 开发中经常需要用一些自定义 View 去满足产品和设计的脑洞,所以 View 的绘制流程至关重要.网上目前有非常多这方面的资料,但最好的方式还是直接跟着源码进行解读,每日一问系列一直追 ...
- python每日一练:0007题
第 0007 题: 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来. # -*- coding:utf-8 -*- import os def count ...
随机推荐
- Golang fmt Printf 格式化参数手册/详解/说明
fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. 格式“占位符”衍生自C,但比C更简单. fmt 包的官方文档对Printing和Scanning有很详细的说明.这里就直接 ...
- 一文读懂Java线程状态转换
前言 本文描述Java线程线程状态及状态转换,不会涉及过多理论,主要以代码示例说明线程状态如何转换. 基础知识 1. 线程状态 Thread源码中的状态说明: 线程可以有6种状态: New(新建) R ...
- 线程---Day22
并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生) 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单CPU系 ...
- 2019-11-07 微信小程序入门
1.什么是微信小程序? 小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”,用户扫一扫或者搜一下即可打开应用,体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题.应用将无处不 ...
- selenium控制超链接在当前标签页中打开或重新打开一个标签页
selenium控制超链接在当前标签页中打开或重新打开一个标签页 在web页面源码中,控制超链接的打开是在当前标签页还是重新打开一个标签页,是由属性target=“_black”进行控制的.如果还有属 ...
- 【python】ConnectionRefusedError: [WinError 10061]
在测试接口过程中,由于各种原因服务端返回:10061,由于目标计算机积极拒绝,无法连接. 图一 图二 造成这种返回结果的可能原因:1.代码问题2.本机代理设置问题3.本地防火墙或者安全卫士之类的设置问 ...
- Linux的基本指令-Linux从入门到精通第二天(非原创)
文章大纲 一.指令与选项二.基础指令(重点)三.进阶指令(重点)四.学习资料下载五.参考文章 一.指令与选项 什么是Linux的指令?指在Linux终端(命令行)中输入的内容就称之为指令. 一 ...
- 206--Reverse A Singly Linked List
package LinedList; public class ReverseASinglyLinkedList { //解法一:迭代. public ListNode reverseList(Lis ...
- Linux文本编辑器Vim使用
1. 插入 o 在光标下插入新行 a 在光标后插入 i 在光标前插入 O 在光标上一行插入新行 A 在光标行尾插入 I 在光标行首插入 2.光标定位 gg 到第一行行首 G 到最后一行 ...
- 蓝色映象 幻舞少女之剑 BLUE REFLECTION 后感
到底是看片收获多还是游戏收获多?在刷蓝色反射的时候刷了2部番.所以,我到底是为了什么在玩游戏呢? 岸田メル的人设,毋庸置疑,唯美想舔,且总能给人一种绝无杂质,纯洁治愈的感觉,再加上浅野隼人的配乐,恰如 ...