阶乘计算器
结果
阶乘
- 位数
- 3
- 末尾零
- 1
阶乘计算器把一个整数从 1 连乘到 n,再给出两个说明它有多大的读数:结果的位数,以及末尾零的个数。5 的阶乘是 120——三位数,末尾一个零。这个值很快就不适合直接印出来,21 以上主读数改用科学计数法,但位数与末尾零仍然精确,因为这两个数是从公式算出来的,不是去数那串印出来的数字。0 的阶乘按定义等于 1(空积),而 170 是这一页能收的最大输入:171 的阶乘超出了双精度能表示的范围,所以拒收,而不是给出一个 Infinity。
0 到 12 的阶乘
| n | 阶乘 | 位数 | 末尾零 |
|---|---|---|---|
| 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 0 |
| 2 | 2 | 1 | 0 |
| 3 | 6 | 1 | 0 |
| 4 | 24 | 2 | 0 |
| 5 | 120 | 3 | 1 |
| 6 | 720 | 3 | 1 |
| 7 | 5040 | 4 | 1 |
| 8 | 40320 | 5 | 1 |
| 9 | 362880 | 6 | 1 |
| 10 | 3628800 | 7 | 2 |
| 11 | 39916800 | 8 | 2 |
| 12 | 479001600 | 9 | 2 |
前十三个阶乘,两个读数并排列出。这些行是为了让增长看得见:第七行过了一千,第十二行过了一亿,而位数一格格往上爬,末尾零也一直等到出现 5 才不是零。顺着最后一列往下读,能看出为什么是 5、10、12 在起作用而 11 不在。每一格都是纯数,所以这张表在全部十个语言里长得一样。
公式
n! = 1 × 2 × … × n 位数 = ⌊lg(n!)⌋ + 1 末尾零 = ⌊n/5⌋ + ⌊n/25⌋ + ⌊n/125⌋ + …
- n
- 要求阶乘的那个数,取 0 到 170 之间的整数。它同时也是因数的个数,因为连乘是从 1 一路乘到 n。上界不是显示上的取舍:171 的阶乘已经超过双精度能表示的最大值,再往上的输入没有答案可给。
- n!
- 阶乘本身,从 1 到 n 的每一个整数相乘的结果。它比指数增长还快:5 的阶乘是 120,10 的阶乘已经是 3628800。一旦超过一百万,面板上的答案就换成科学计数法——这样既保住了量级,也不必印出一百多位数字。
- 位数
- 这个阶乘有多少位十进制数字。它由对数求和得到,不是去数某个印出来的串的长度,所以在取值范围的顶端也照样准确——那里印出来的阶乘只剩七位有效数字,数它会数错。
- 末尾零
- 阶乘末尾有几个 0。每一个末尾零都要一个 10,而一个 10 要一个 2 配一个 5;阶乘里 2 远比 5 多,所以这件事完全由 5 决定——5 的倍数各出一个,25 的倍数再出一个,125 的倍数再出一个。
要的就是那个数本身时用这一页:一整套东西的排列方式有几种、数列里的某一项是多少、一个连乘积有多大。若是从一个池子里取若干个——组合数或排列数——那是先用阶乘相除,答案在组合与排列那两页。
算例
5 的阶乘
- 从 1 往上乘:1 × 2 = 2
- 2 × 3 = 6
- 6 × 4 = 24
- 24 × 5 = 120
- 120 有三位数字、末尾一个零,所以两个读数分别是 3 与 1
三个读数都能用眼睛核对的最小的一格。乘出来的数短到能读全,位数与末尾零也一眼看得见——首屏开在这个值上就是因为这个。
读数改用科学计数法的那一格
- 从 1 连乘到 20,精确值是 2432902008176640000
- 这是十九位数,所以位数读数是 19
- 其中四位是末尾的零,由 5、10、15、20 里的 5 贡献
- 面板把乘积印成 2.432902 × 10¹⁸,而不是那串十九位数字
印出来的值从这一格开始不再是精确值。面板上的七位是同一个数的前七位有效数字,所以三个读数说的是同一件事,只是其中一个短到能印出来。21 以下印出来的乘积是精确的。
100 的阶乘末尾有多少个零
- 数 100 以内 5 的倍数:20 个
- 加上 25 的倍数,它们各带第二个 5:4 个
- 再加上 125 的倍数——没有,125 已经超出 100
- 20 + 4 = 24 个末尾零
- 阶乘本身有 158 位,印成 9.332622 × 10¹⁵⁷
这一格的答案在那个零的个数上,而它是只看 5 的个数算出来的,与那个数本身无关。100 的阶乘有 158 位,就算全部印出来,也看不出它末尾有几个零。
局限
只收 0 到 170 的整数。负数拒收,因为负整数上的阶乘没有定义——把它推广到别的数上的 Gamma 函数在每一个负整数处都是极点。小数同样拒收。超过 170 时乘积会溢出成无穷大,所以那种输入按名字被拒,而不是给出一个错答案。21 以上印出来的阶乘是科学计数法的近似值,不是精确整数;位数与末尾零不受影响,它们合起来描述了一个数字没被全部印出来的数有多大。这一页不算组合数与排列数,它给的是那两页赖以计算的阶乘。
常见问题
- 阶乘是什么?
- 从 1 一直乘到你给的那个数的连乘积。5 的阶乘就是 1 × 2 × 3 × 4 × 5 = 120。它数的是一组互不相同的元素一共有几种排法,所以它出现在计数与概率里,而不是出现在测量里。
- 0 的阶乘为什么等于 1?
- 因为它是空积——没有东西要乘,而让乘积不变的那个值就是 1。这个约定不是硬凑的:它让「什么都不排」恰好有一种排法这个说法成立,也让 n! = n × (n−1)! 这条递推式在 n 等于 1 时仍然对。
- 为什么最多只能算到 170?
- 因为 171 的阶乘比双精度浮点数能表示的最大值还大,算出来是无穷大。这不是显示上的限制,而是 170 以上的输入没有可表示的答案。170 的阶乘本身约是 7.26 × 10³⁰⁶,是一个 307 位的数。
- 末尾零的个数是怎么数出来的?
- 数阶乘里有多少个因数 5。一个末尾零要一个 10,一个 10 要一个 2 配一个 5;2 多得用不完,所以由 5 决定。5 的倍数各出一个,25 的倍数再出一个,125 的倍数再出一个。100 的阶乘就是 20 + 4 = 24 个。
- 为什么用科学计数法印阶乘?
- 因为 21 以上位数就多到结果面板放不下了——100 的阶乘有 158 位。科学计数法保住了量级。精确的那个整数仍然是另外两个读数在描述的东西:位数告诉你它有多长,末尾零告诉你它怎么收尾。
- 大数阶乘的位数是多少?
- 位数那一格给出的是精确值,在这一页收的每一个输入上都精确。它是把对数加起来得到的,不是去量一个印出来的字符串,所以印出来的值是近似的时候它也不会失准。位数永远至少比末尾零的个数多一。
参考资料
- Factorial — 阶乘的定义、让 0! 等于 1 的空积约定,以及这个值增长的速度 — Wolfram MathWorld (United States)
- A000142 — 阶乘数列 1, 1, 2, 6, 24, 120 …,收录了远超双精度范围的那些精确值 — OEIS Foundation (United States)
- Combination — 组合数写作一个阶乘除以另外两个阶乘,这是阶乘最常被用到的地方 — Wolfram MathWorld (United States)