Ima*_*889 1 math excel permutation
是否可以在不使用 VBA 且不使用任何“帮助”表或行/列的情况下在 Excel 中生成排列表?
对于 N 列,将有 N! 行。
例如,N=3 的表将如下所示:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
Run Code Online (Sandbox Code Playgroud)
打开一个空白工作表并将以下公式粘贴到单元格 A1 中。(为了可读性,我包括了换行符。)
= IF(ROW()<=FACT(COLUMN()-1),COLUMN(),
INDIRECT(ADDRESS(ROW()-FACT(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+1),
IF(COLUMN()=(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+2),1,COLUMN()+1))))
Run Code Online (Sandbox Code Playgroud)
只需将此公式拖过 N 列,然后向下拖 N!行以生成 N 阶完整排列表。
需要注意的几点:
因为阶乘增长非常快,所以上面的公式只适用于 N<=10。然而,这并不是真正的限制,因为 10!= 3,628,800,这是一个超过 Excel 2010 中的最大行数(即 1,048,576)的数字。因此,Excel 无论如何都无法生成 N=10 的排列表。
如果您希望表格的左上角是 A1 以外的单元格,则可以手动修改公式以解决此偏移。例如,如果您希望表格从 A2 而不是 A1 开始,请将ROW()上面公式中的每个实例替换为(ROW()-1)。
排除第一行(升序排列)和最后一行(排列降序排列),此表中排列的排列顺序与原始问题中列出的顺序不同,而是模式仍然是确定性的。请参阅下面的屏幕截图,获取使用此 4 阶公式的排列表的屏幕截图,使用条件格式可以轻松发现排列顺序如何随着行号增加而变化的模式。
编辑:
除了排列以不同顺序生成之外,具有与上述所有相同属性的另一种解决方案如下:
= IF(ROW()<=FACT(COLUMN()-1),COLUMN(),
INDIRECT(ADDRESS(ROW()-FACT(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+1),COLUMN()))
+IF(ROW()<=FACT(COLUMN()),-1,
IF(INDIRECT(ADDRESS(ROW()-FACT(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+1),COLUMN()))
=INDIRECT(ADDRESS(ROW(),(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+2))),1,0)))
Run Code Online (Sandbox Code Playgroud)
这个公式显然比第一个公式长,但它通常完成同样的事情:打开一个空白工作表并将这个公式粘贴到单元格 A1 中。然后将公式拖过 N 列,然后向下拖 N!行以生成 N 阶完整排列表。
然而,如前所述,与之前的解决方案相比,排列的顺序发生了变化。这个解决方案中的排列顺序可以说比第一个解决方案更好,因为每列总是包含相同大小的数字“块”。请参阅下面的屏幕截图,获取使用此 4 阶公式的排列表的屏幕截图,使用条件格式可以轻松发现排列顺序如何随着行号增加而变化的模式。