问题描述:
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]