Re: [问题] 100!的结尾

楼主: LPH66 (-6.2598534e+18f)   2019-12-28 03:50:23
: 推 stimim: 心算好像也不是不行,很勉强就是了,先把 5 和 2 算完 12/26 19:43
: → stimim: 奇数的部份只考虑尾数 1 3 7 9 ,一组乘起来还是 9 12/26 19:44
: → stimim: 偶数的部份除一次 2 会有一半变奇数,就用奇数的方法解 12/26 19:47
: → stimim: 剩下的偶数再除 2 又有一半变奇数,直到只剩一个数为止 12/26 19:48
是说, 如果只是要快速纸笔算的话, 用↑这些东西其实就足够了:
在纸上写出所要求的 n, 然后在旁边和下面写成一张表; 以 100 为例会写成这样:
100 50 25 12 6 3 1
20 10 5 2 1
4 2 1
写表的规则是往右除以 2 向下取整, 往下除以 5 向下取整, 写到 0 为止
接下来的动作是:
(A) 把这些数十位以上的部份每 20 消掉, 如果有剩下 10 则记下两个“3”
这里 100 和 20 自己消掉, 50 消掉两个 20 剩下的 10 和它下面的 10 对消
25 的 20 消掉, 剩下 12 的 10
(B) 个位数把 1 2 7 8 划掉, 3 4 5 6 合起来数个数当做“3”, 9 算两个“3”
累积四个则可以一起消掉
这里划掉后合计一共五个“3”, 去掉四个剩下一个
(C) 求出 (A)(B) 总共多少个“3”, 求 3 的这么多次方的个位数
这里总计三个“3”所以个位是 3^3 = 27 → 7
这部份是在计算扣掉 2 和 5 的因子之后剩下的部份乘积的个位数
表中的数字表示我们需要考虑 1 到此数之间所有个位是 1 3 7 9 的数乘起来
偶数部份把所有数拿掉一个 2 后即是由表中它右边的数负责
五的倍数部份也是同理, 由表中它下面的数负责
所以到最后表中每一格都负责了一部份数 (2 和 5 有特定个数的数会给同一格负责)
然后对每一格求乘积, 利用两组 1 3 7 9 乘起来个位是 1 消掉 20
一组 1 3 7 9 乘起来个位是 9 = 3*3, 个位剩 9 也是这边
然后个位余数, 1 2 的乘积只有 1, 3 4 5 6 是 1*3 = 3, 7 8 是 1*3*7 = 21
所以划掉 1 2 7 8, 收集 3 4 5 6 每个为乘积个位贡献一个 3
接着就求 3 的这么多次方的个位即可, 周期是 3-9-7-1 所以每四个“3”也可以消掉
(D) 再来要求表最上列的和减去表最左行的和, 当然最左上自己消掉所以不管
剩下的最左行的和会很接近最上列左数第三个数 (n/4), 和它消掉
最上列其余的数总计时把 4 的倍数也消掉
最后剩下的总和就求 2 的次方的个位数
这里最左行总和是 24, 和 25 消掉剩 1
50 余 2, 12 倍数, 6 余 2 和 50 消, 3 和 25 剩下的 1 消, 剩下 1, 2^1 = 2
很容易发现这里就是在算乘积中 2 的次方有多少
剩下的最左行的和会接近 n/4 的理由是 (1/5)/(1-1/5) = 1/4
差距通常会只有 1~2, 不过还是要算一下避免出事
(这里可以只用个位求和来求差距, 因为结果总是不大且减完一定有剩)
然后总计时消掉 4 的倍数同样是利用 2 的次方个位周期 2-4-8-6
这里要稍微注意的是如果消光了那这里应该要押 2^4 = 16 的 6 不是 2^0 = 1
(E) (C)*(D) 的个位即是最终答案了: 7*2 = 14 → 4 得 100! 末位非零是 4
这样写了很大一篇但实际操作起来就是划掉划掉再划掉
最后剩下的结果就能马上心算求得答案
我自己实验过用这样的划法算 1000! 的末位非零大概一分钟左右就有答案 [答案是 2]
应该算是个不错的纸笔速算法

Links booklink

Contact Us: admin [ a t ] ucptt.com