本帖最后由 魚。。 于 2021-5-19 17:47 编辑
接下来要把Int和Mod约起来玩一下了: 这次我想得到这样的序列:1,1,2,2,3,3,1,1,2,2,3,3 …… 首选,每个数重复了2次,之前用的Int,然后整体又再循环,刚讲完的求魚: =MOD(INT(ROW(A2)/2)-1,3)+1 通过两人的配合,得到了我想要的结果。 以上说了许多偏废话的内容(因为90%的小伙伴应该都比我熟)
接下来得严肃点,要聊聊今天想分享给大家的一点小运用。 刚才这个公式:=MOD(INT(ROW(A2)/2)-1,3)+1 Row里边开始的行号是准备重复多少次的次数,“/” 号后边也是一样的。 Mod的第二参数是数字循环的上限,要循环到3,所以是3 若重复个数用 n 来表示,当n=1的时候,也就是不需要重复元素 那么 =MOD(INT(ROW(A1)/n)-1,3)+1 就等同于 =MOD(ROW(A1)-1,3)+1 若循环里最大值用 m表示,当 结果个数 <= n*m 的时候 比如 n =2,m =3 ,当结果数量 <= 6 时 那么 =MOD(INT(ROW(A2)/n)-1,m)+1 和 =INT(ROW(A2)/n) 得到的结果就是一样的 切回主题:《多组相同大小数组的所有组合》: 我们看一下公式统一之后,3列公式的区别主要就是INT里边的行数,和除数: =MOD(INT(ROW(9:9)/9)-1,3)+1 =MOD(INT(ROW(3:3)/3)-1,3)+1 =MOD(INT(ROW(1:1)/1)-1,3)+1 观察一下可以得到变化规律:前一列是后边一列的3倍。也就是3的一组求幂运算: 9=3^2,3=3^1,1=3^0 那3是什么呢,3就是数据源一共有多少行需要组合。 而2,1,0 是列的变化,所以我们只要通过列号的变化,就可以统一公式了 然后我们再来看一下,mod第二参数里边的3 =MOD(INT(ROW(9:9)/9)-1,3)+1 这里的3是循环最大值,如果数据源有4行数据,那么这里自然就是要循环到4了,所以这个3是也是数据源的行数。 这样的话,若我们用 r 表示数据源的行数。 可以得到这个结果: =MOD(INT(r^2/r^2)-1,r)+1 =MOD(INT(r^1/r^1)-1,r)+1 =MOD(INT(r^0/r^0)-1,r)+1 那么里边2,1,0 如果通过函数生成呢。前边说了一下Column函数嘛 用数据源的列数 c 分别减去column(a1),column(b1),column(c1)就可以得到啦 所以又得到了这个结果: =MOD(INT(r^(c-column(a1))/r^(c-column(a1)))-1,r)+1 =MOD(INT(r^(c-column(b1))/r^(c-column(b1)))-1,r)+1 =MOD(INT(r^(c-column(c1))/r^(c-column(c1)))-1,r)+1 所以我们在P列输入公式: =MOD(INT(r^(c-column(a1))/r^(c-column(a1)))-1,r)+1 右拉之后,也就得到后两个公式了 那么公式下拉的时候,别忘了还要生成序列呢,所以这时候又要肉肉了。 =MOD(INT((ROW(A1)-1+r^(c-column(a1)))/r^(c-column(a1)))-1,r)+1 至于为什么要row(a1)-1,自然是因为要从0开始加,因为初始行已经用r^(c-column(a1))处理好了,也可以用row()-公式所在的行号。灵活运用就不多说了。 序列我们构建好了,剩下就是引用了。 Index,offset等自己挑一个吧。比如: =OFFSET(a$1,MOD(INT((ROW(A1)-1+r^(c-column(a1)))/r^(c-column(a1)))-1,r)+1,) 最后完善一下,因为整体全部循环完一次后,还会再来一次。别忘了第一列也是套了mod的。所以加个判断:当行数超过组合结果的数量,就不显示了呗。 组合结果有多少怎么知道的:(前边说过了,不说你应该也知道了) 我就这样写了: =if(row(a1)>r^c,"",OFFSET(a$1,MOD(INT((ROW(A1)-1+r^(c-column(a1)))/r^(c-column(a1)))-1,r)+1,)) 把r ,c 换成行数,列数,也就出结果了。行数,列数可以用单元格引用。或者直接counta等动态获取。就不过多阐述了。 基础的东西,被我写了嫩么多,有点班门弄斧的感觉。不管了,第一个分享帖嘛,以后学业又成了,再和大家分享讨论。涉及相关知识不完善,不合理的地方,欢迎大家讨论、指正。针对这一类型有其他好的方法,也欢迎老师们借此附件需求进行赐教以助学习。 End,谢谢!
|