排列组合
P(n,k)/C(n,k)/阶乘大数
8 项核心计算
二项式展开 (x + y)^n
帕斯卡三角形(前 12 行)
应用场景
关于本工具
了解工具定位 · 使用场景 · 对比优势
使用场景
密码组合评估
安全审计人员需要评估一个 8 位密码(含大小写字母+数字)的暴力破解难度。使用排列组合工具计算 P(62,8) ≈ 1.3×10¹⁴ 种可能,结合当前 GPU 算力(约 10⁹ 次/秒)可快速得出破解耗时约 36 小时,从而判断密码策略是否达标。
彩票中奖概率
彩民购买双色球复式票(选 7 个红球+2 个蓝球),想知道中头奖的概率变化。使用组合工具计算 C(33,7)×C(16,2) 与标准单式 C(33,6)×C(16,1) 的比值,立刻得出复式票的中奖概率是单式的 7 倍,但投入成本也是 14 倍,辅助理性决策。
赛事对阵编排
体育赛事组织者需要为 8 支队伍安排单循环赛程,想知道总共要打多少场比赛。使用组合工具计算 C(8,2)=28 场,再结合分组后每组 4 队的 C(4,2)=6 场×2 组=12 场,快速对比不同赛制的总场次,优化赛程编排。
抽样方案设计
市场调研员从 100 个客户中抽取 5 个进行深度访谈,想知道所有可能的样本组合有多少种。使用组合工具计算 C(100,5)≈7.5×10⁷,结合置信度要求快速确定分层抽样或系统抽样的样本量,避免因组合数过大而低估抽样复杂度。
实验条件组合
药物研发人员需要测试 3 种温度(25°C/37°C/42°C)×4 种浓度(0.1/0.5/1.0/2.0 mg/mL)×2 种 pH 值(7.0/7.4)的组合效果。使用排列组合工具计算 3×4×2=24 组实验条件,快速确认实验设计是否完整,避免遗漏关键组合。
对比矩阵本工具 vs 竞品 vs 传统方法
| 维度 | 本工具 | 竞品 A | 传统方法 |
|---|---|---|---|
| 数据隐私 | 纯浏览器,零上传 | 上传到服务器 | 依赖工作人员 |
| 处理速度 | 1 秒内 | 5-10 秒 | 数小时 |
| 离线可用 | 支持 | 不支持 | 支持 |
| 大小限制 | 无限制(支持大数) | 受服务器限制 | 受人力限制 |
| 收费 | 免费 | 免费 | 收费 |
| 平台 | 任何浏览器 | 网页端 | 线下/人工 |
使用指南
上手步骤 · 输入输出 · 避坑提示
输入输出示例8 个典型场景,覆盖常规、边界与易错
| 输入 | 输出 | 说明 |
|---|---|---|
| n=5, k=3, 排列 P(5,3) | 60 | 典型场景:从5个元素中选3个排列 |
| n=10, k=3, 组合 C(10,3) | 120 | 典型场景:从10个元素中选3个组合 |
| n=100, k=50, 组合 C(100,50) | 100891344545564193334812497256 | 边界 case:中等大数,检验大数精度 |
| n=0, k=0, 排列 P(0,0) | 1 | 边界 case:空排列/组合约定为1 |
| n=5, k=6, 排列 P(5,6) | 0(无效输入) | 易错 case:k > n 时排列无意义 |
| n=1000, k=1, 组合 C(1000,1) | 1000 | 边界 case:k=1 时结果恒等于 n |
| n=10, k=10, 排列 P(10,10) | 3628800 | 典型场景:全排列,即 n 的阶乘 |
| n=170, k=170, 阶乘 170! | 7.257415615307994e306 | 边界 case:接近 JavaScript 浮点数上限 |
常见错误对照7 个常踩的坑 · 错误 → 修复
1. 混淆排列与组合:顺序是否重要
计算从 5 人中选 3 人排队的方案数时,输入 C(5,3)=10排队顺序重要,应输入 P(5,3)=60排列(P)考虑顺序,组合(C)不考虑。选人排队、密码、名次等场景用排列;选人组队、抽奖、选课等场景用组合。
2. n 和 k 填反位置
计算 10 个球取 3 个的排列数,输入 P(3,10)输入 P(10,3)=720排列组合公式中第一个参数是总数 n,第二个是选取数 k。n<k 时排列结果为 0,组合结果也为 0,但用户预期往往是 n≥k。
3. n 或 k 输入负数或非整数
输入 n=-5, k=3 或 n=10.5, k=2输入 n=5, k=3 或 n=10, k=2排列组合的 n 和 k 必须是自然数(非负整数)。负数或小数在数学上无定义,工具会返回错误或 NaN。
4. k 大于 n 时误以为结果为 0
计算 C(3,5) 后质疑“为什么结果是 0,我明明选了 5 个元素”理解 C(3,5)=0,因为不可能从 3 个元素中选出 5 个不同的元素当 k>n 时,排列和组合的结果严格为 0。这是数学定义,不是工具 bug。用户常把 n 和 k 的含义搞反导致困惑。
5. 对大数结果期望有限精度
计算 P(100,50) 后抱怨“结果只有科学计数法,不是精确整数”使用工具的大数模式(BigInt),或接受科学计数法作为近似值P(100,50) ≈ 3.0e+93,远超 64 位整数上限(9e18)。普通计算器只能给出浮点近似;本工具若支持 BigInt 则输出精确值。
6. 误用阶乘计算排列组合
手动计算 P(10,3) 时写成 10! / 3! 得到 604800(错误)正确公式为 P(10,3)=10!/(10-3)!=10!/7!=720排列公式是 n!/(n-k)!,不是 n!/k!。组合公式是 n!/(k!(n-k)!)。混淆分母是常见低级错误。
7. 未区分“可重复”与“不可重复”场景
计算 3 位数密码(每位 0-9)的方案数时,输入 P(10,3)=720密码数字可重复,应使用可重复排列:10^3=1000标准排列组合工具只处理“不可重复”场景。密码、骰子、车牌号等允许重复的计数需用幂运算,不在本工具范围内。
工作原理
公式推导 · 流程图解 · 依据出处
核心公式
P(n,k) = n! / (n-k)!
变量说明
n— 总元素个数(正整数)k— 选取元素个数(0 ≤ k ≤ n)P(n,k)— 排列数,有序选取方式总数
示例
从 10 个不同参赛者中选 3 人分别获冠/亚/季军(顺序重要)。n=10, k=3。P(10,3) = 10! / 7! = 10×9×8 = 720 种不同名次结果。
适用范围
适用于无重复元素的有序选取。若元素可重复(如密码组合)或选取后不放回,需改用 n^k 或组合公式。
原理图
开发者集成
3 种主流语言 · 复制即用
import math
# 阶乘:n!
n = 5
fact = math.factorial(n)
print(f"{n}! = {fact}") # 120
# 排列数 P(n,k) = n! / (n-k)!
n, k = 5, 3
perm = math.perm(n, k)
print(f"P({n},{k}) = {perm}") # 60
# 组合数 C(n,k) = n! / (k! * (n-k)!)
comb = math.comb(n, k)
print(f"C({n},{k}) = {comb}") # 10
# 大数阶乘(Python 自动支持大整数)
big_n = 100
big_fact = math.factorial(big_n)
print(f"{big_n}! 有 {len(str(big_fact))} 位") # 158 位package main
import (
"fmt"
"math/big"
)
func main() {
// 阶乘:n!(使用 big.Int 支持大数)
n := int64(5)
fact := new(big.Int).MulRange(1, n)
fmt.Printf("%d! = %s\n", n, fact.String()) // 120
// 排列数 P(n,k) = n! / (n-k)!
n, k := int64(5), int64(3)
nFact := new(big.Int).MulRange(1, n)
nkFact := new(big.Int).MulRange(1, n-k)
perm := new(big.Int).Div(nFact, nkFact)
fmt.Printf("P(%d,%d) = %s\n", n, k, perm.String()) // 60
// 组合数 C(n,k) = n! / (k! * (n-k)!)
kFact := new(big.Int).MulRange(1, k)
comb := new(big.Int).Div(perm, kFact)
fmt.Printf("C(%d,%d) = %s\n", n, k, comb.String()) // 10
// 大数阶乘
bigN := int64(100)
bigFact := new(big.Int).MulRange(1, bigN)
fmt.Printf("%d! 有 %d 位\n", bigN, len(bigFact.String())) // 158 位
}// 阶乘:n!(支持大整数 BigInt)
function factorial(n) {
let result = 1n;
for (let i = 2n; i <= BigInt(n); i++) result *= i;
return result;
}
const n = 5;
console.log(`${n}! = ${factorial(n)}`); // 120n
// 排列数 P(n,k) = n! / (n-k)!
function perm(n, k) {
return factorial(n) / factorial(n - k);
}
const pn = 5, pk = 3;
console.log(`P(${pn},${pk}) = ${perm(pn, pk)}`); // 60n
// 组合数 C(n,k) = n! / (k! * (n-k)!)
function comb(n, k) {
return factorial(n) / (factorial(k) * factorial(n - k));
}
const cn = 5, ck = 3;
console.log(`C(${cn},${ck}) = ${comb(cn, ck)}`); // 10n
// 大数阶乘(100!)
const bigN = 100;
const bigFact = factorial(bigN);
console.log(`${bigN}! 有 ${bigFact.toString().length} 位`); // 158 位常见问题
7 个高频疑问