求N位数字的不同数位排列数算法(N≤18)
含重复数位的数字排列数计算方法
核心公式
当数字里存在重复数位时,不同排列的总数用以下公式计算:总排列数 = N! / (k₁! × k₂! × ... × kₘ!)
参数说明:
N是数字的总位数k₁, k₂, ..., kₘ是每个重复数位的出现次数(仅统计出现次数≥2的数位即可,因为1!等于1,乘入后不影响结果)
实际例子
举两个直观的例子:
- 你提到的214:所有数位无重复,每个数位出现1次,分母为1!×1!×1! = 1,结果为3! / 1 = 6,和预期一致。
- 再比如数字1122:总位数N=4,1出现2次,2出现2次,分母是2!×2! = 2×2=4,总排列数为4! /4 = 24/4=6,对应的排列是1122、1212、1221、2112、2121、2211。
具体实现步骤
- 统计数位出现次数:将数字拆分为单个数位,统计0-9每个数字的出现频次。
- 计算总阶乘:算出N的阶乘(N≤18时,18!为6402373705728000,64位整数可容纳,Python无需担心溢出问题)。
- 计算分母乘积:对每个出现次数大于1的数位,计算其出现次数的阶乘,再将所有这些阶乘相乘。
- 得出结果:用总阶乘除以分母乘积,得到不同排列的数量。
特殊情况处理
如果题目要求排列后的数必须是合法N位数(不能以0开头),需额外调整:
- 先按公式算出包含前导零的所有排列数
- 计算以0开头的非法排列数:将0固定在第一位,剩余N-1位用同样公式计算排列数
- 最终合法排列数 = 总排列数 - 非法排列数
内容的提问来源于stack exchange,提问作者K123
相关产品推荐
相关产品推荐

