Python练习(21)-分糖果-中

博客探讨了一个关于10个小孩分糖果的问题,每个小孩按特定规律传递糖果,然后根据奇数条件向老师要糖。文章分析了解决方案,包括错误的判断函数和效率优化,最终得出正确结果,强调了编程中的错误查找和算法优化的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

10个小孩围城一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。
问经过这样几次后大家手中的糖的块数一样多? 每人各有多少块糖?

分析:
首先,糖的传递a[i]=(a[i]+a[i-1])/2,要用到小索引元素,所以应该从大到小遍历,记得每次循环前先取出a[9],最后加到a[0]
判断是否是奇数
构造全相等的判断函数

#构造糖块全相等的判断函数
def isequal(c):
    for v in range(len(c)-1):
        if c[v]!=sum(c)/len(c):
            return False
#主体函数
a=[10,2,8,22,16,4,10,6,14,20]
k=1
while k < 100:
    last=a[9]
    a[0]=(a[0]+last)/2
    if a[0]%2!=0:
        a[0]=a[0]+1
    for i in range(9,0,-1):
        a[i]=(a[i]+a[i-1])/2
        #此处在循环内直接判断是否是奇数。如果再来一个循环的话for i in range(10),复杂度大大增加。
        if a[i]%2!=0:
            a[i]=a[i]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值