每次循环后的值堆叠在x左侧,下次循环引用第一列内容运算,保留每次运算的结果。
题目描述:10个小孩围成一个圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖果一半给右边的小孩,糖果为奇数的人可向老师要一块。问,经过这样几次后大家手中的糖果的块数一样多?每个人各有多少块?
参考公式:
- =REDUCE(+A2:A11,A2:A100,LAMBDA(x,y,IF(AND(@x=TAKE(x,,1)),x,HSTACK(CEILING(TAKE(x,,1)/2+VSTACK(TAKE(x,-1,1),TAKE(x,9,1))/2,2),x))))
复制代码
公式简要说明如下:
=REDUCE(
+A2:A11, 初始每人糖块数量作为x初始值
A2:A100, 引用单元格区域,控制循环次数(和单元格值无关),一共循环99次,可以使用A1:A30、1:1等代替
LAMBDA(x, y,
IF(
AND(@x = TAKE(x, , 1)), 如果第一列的第一个值等于第一列所有值(每个人糖数量相等)就停止运算保留x不变
x,
HSTACK(
CEILING( 每个人分完糖后,如果是奇数,就向上舍入到最接近偶数(因为可以再跟老师要一块)
TAKE(x, , 1) / 2 + x最左侧列存储每个人糖数量的最新值。数量除以2,加上别人给的一半
VSTACK(TAKE(x, -1, 1), TAKE(x, 9, 1)) / 2, 每个人糖数量的一半,将最后一个人的拿到第一个去
2
),
x
)
)
)
)
|