问:

【基础题】:有 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. PIE SDK主成分变换

    1.算法功能简介   主成分变换(Principal Component Analysis,PCA)又称K-L(Karhunen-Loeve)变换或霍特林(Hotelling)变换,是基于变量之间的相 ...

  2. DISK2VHD 转win2008 无法启动

    windows 2008R2物理机,使用微软的DISK2VHD转换成虚拟盘,挂到虚拟机上,无法启动只有光标闪.找来window2008安装盘 选择“修复windows系统”, 调出cmd命令提示符Bo ...

  3. salesforce零基础学习(九十四)classic下pagelayout引入的vf page弹出内容更新此page layout

    我们在classic环境中,有时针对page layout不能实现的地方,可以引入 一个vf page去增强标准的 page layout 功能,有时可能要求这个 vf page的部分修改需要更新此 ...

  4. JavaWeb Listener之HttpSessionBindListener

    HttpSessionBindListener        监听把自身这个对象绑定到HttpSession对象上.解绑 绑定到HttpSession对象上,其实就是调用session的setAttr ...

  5. iOS 上传appstore 一直卡在正在通过 App Store 进行鉴定(转)

    原帖地址:https://www.jianshu.com/p/d28714f3ef74 手动操作一下执行xcode包里面的命令行操作: (1)找到前往>应用程序里面的xcode (2)显示包内容 ...

  6. ubuntu,安装、配置和美化(1)

    ubuntu linux 1.前言 1.1关于Ubuntu Linux Ubuntu是一个以桌面应用为主的Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu"一词,意思是“ ...

  7. Nginx+Mysql调优

    使用nginx实现反向代理作用,具备负载均衡的功能.     接受客户端的请求 | nginx(宿主机) | |-------------------| web1 web2 (客户机)   原理: 与 ...

  8. linux常见性能分析工具

     vmstat    sar  (来源于sysstat工具包,需要yum  sysstat)iostat  (来源于sysstat工具包,需要yum  sysstat)free  -muptimene ...

  9. 转: angularjs select 赋值 ng-options配置方式

    摘自: http://blog.csdn.net/chwshuang/article/details/53861249 数组方式 数据是数组 $scope.years = [2014, 2015, 2 ...

  10. android 8.0 悬浮窗 最简demo

    MainActivity.java文件 package com.example.performance; import android.app.Activity; import android.con ...