排列组合

P(n,k)/C(n,k)/阶乘大数

424 次访问

排列组合计算

8 项核心计算

二项式展开 (x + y)^n

帕斯卡三角形(前 12 行)

高亮第 n 行

应用场景

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

🔐

密码组合评估

安全审计人员需要评估一个 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 或组合公式。

原理图

输入参数n, k 值选择 P/C/阶乘浏览器内计算阶乘乘法循环BigInt 大数处理展示结果精确数值无精度损失输入校验n ≥ k ≥ 0 整数公式计算P=n!/(n-k)!C=n!/(k!(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 个高频疑问

为什么我算的 C(10, 5) 结果是 252,但手算应该是 252,怎么验证?
这个工具的计算结果完全正确。C(10, 5) = 10! / (5! × 5!) = 3628800 / (120 × 120) = 252。如果手算也得到 252,说明双方一致。如果发现不一致,请检查输入:组合数 C(n,k) 要求 n ≥ k ≥ 0 且 n、k 均为整数。常见错误是把 k 输成了 n-k(C(10,5) 和 C(10,5) 相同,但 C(10,7) 结果也是 120,不是 252)。
输入 n=100, k=50 时结果为什么显示科学计数法,而不是完整数字?
因为 C(100, 50) 的结果是一个 29 位的整数(约 1.0089e29),远超 JavaScript 的 Number 安全整数范围(2^53,约 9e15)。本工具在浏览器端用 JS 的 Number 类型计算,超过安全整数时自动转为科学计数法显示,但实际值仍然是精确的——只是显示为科学记数法。如果需要完整 29 位数字,可以用支持大数运算的专用工具或 Python 的 math.comb() 输出。
P(10, 3) 和 C(10, 3) 有什么区别?我什么时候该用哪个?
P(10,3)=720 表示从 10 个里选 3 个排顺序(如:10 人里选冠亚季军,顺序不同算不同结果)。C(10,3)=120 表示只选 3 个不排顺序(如:10 人里选 3 个去开会,谁去都一样)。日常场景:抽奖中奖号码(顺序无关)用组合 C;密码排列、比赛名次、座位安排用排列 P。如果不确定,记住关键词:顺序重要→排列;顺序不重要→组合。
我输入 n=200, k=1 为什么计算很快,但 n=200, k=100 就卡住了?
本工具是纯浏览器端计算(FE 实现),没有后端服务器参与。n=200, k=1 只需计算一次乘法(200),瞬间完成。n=200, k=100 需要计算 200! / (100! × 100!),涉及大数阶乘的乘法运算,浏览器 JS 单线程处理大量浮点运算时会短暂卡顿。实际 C(200,100) 结果约 9.05e58,计算需要约几十毫秒到几百毫秒,属于正常范围。如果卡顿超过 2 秒,可能是浏览器内存不足,建议关闭其他标签页重试。
输入负数或小数会怎样?为什么不能算?
排列组合数只对非负整数有定义。输入 -5 或 3.7 时,工具会在输入框校验阶段拦截并提示「请输入非负整数」。如果强行提交(如通过控制台),JavaScript 内部计算会返回 NaN 或 Infinity。这是因为阶乘只定义在自然数上,负数和分数没有阶乘概念。如果遇到需要计算「从 10 个里选 2.5 个」的场景(实际不存在),请检查问题是否理解有误。
这个工具和手机上计算器算出来的结果一样吗?
基本一致,但手机计算器通常有上限。标准手机计算器(如 iPhone 科学计算器)的阶乘功能最大支持到 69!(约 1.7e98),超出后显示溢出。本工具同样基于 JavaScript Number,最大支持到 170!(约 7.3e306),超出显示 Infinity。排列组合计算时,如果 n 或 k 很大但结果在范围内(如 C(300,1)=300),本工具能正常输出;而手机计算器可能因中间阶乘溢出而报错。对于小数值(n≤30),两者结果完全一致。
我算完的结果能复制到 Excel 里用吗?格式会不会乱?
可以。工具的结果显示区域是纯文本数字(如「252」或「1.0089e29」),直接选中复制即可粘贴到 Excel 的单元格。科学计数法形式的数字(如 1.0089e29)在 Excel 中会被识别为数字格式,显示为 1.01E+29,数值精度不变。如果希望保留完整整数,建议在结果区点击「复制」按钮(如果有),或手动复制后粘贴为文本格式。注意:Excel 单元格数字精度只有 15 位有效数字,超过部分会被四舍五入。
选择 打开 +新窗口 esc关闭