具有大阶乘的数学(例如除法?
Mathematics with large factorials (e.g. division?)
我试图找到长度超过 50 的循环的 100 个数字的排列的百分比。这涉及由具有大阶乘的除法组成的数学,这些除法不能很快手动完成,所以我需要求助于编程。例如,这些术语包含
(3!/100!(*((99!/3!)+ (98!/2!)+ (97!/1!)+ (96!/0!
我可以重新排列所有术语以提供一个只需要除以 100 的大数 (>2^64( 即可得到我的答案。
我想了很久,对C++还是新手,我不确定如何用大数进行除法。通常,当我处理大阶乘时,我会将数字的数字输出到数组中并通过它进行乘法,但我不完全确定如何以这种方式进行除法。在C++处理大数数学的最佳方法是什么?
从方程的结构(非常大的阶乘乘与一些大小大致相同的大阶乘的倒数(可以明显看出,可能会发生很多抵消。这意味着这个问题可以用一些非常简单的代数来解决,即使没有任何计算,也需要一点额外的运气。
让我们用一些无辜的小字母代替阶乘,以避免被大数字吓倒。
根据定义,0! = 1 和 1!=1,我们可以跳过这些值并使用以下替换:
a = 2!, b = 3!,v = 96!, w = 97!, x = 98!, y = 99!, z = 100!
这给了
(b/z)*(y/b + x/a + w + v)
扩大
b*(y/b + x/a + w + v) * 1/z
扩展分子(让我们使用一些 ASCII 艺术来提高易读性(
b*x
y + (b*w) + (b*v) + ---
a
------------------------
z
将其全部压缩成一份
(a*y) + (a*b*w) + (a*b*v) + (x*b)
---------------------------------
(a*z)
拆开
a*y a*b*w a*b*v x*b
----- + ------- + ------- + -----
a*z a*z a*z a*z
是的,看起来不错,我们可以把数字放回去
2!*99! 2!*3!*96! 2!*3!*97! 3!*98!
--------- + ------------- + ------------- + ---------
2!*100! 2!*100! 2!*100! 2!*100!
第一轮取消(可能在信件阶段已经完成(
99! 3!*96! 3!*97! 3!*98!
------ + ---------- + -------- + --------
100! 100! 100! 2!*100!
阶乘相互抵消,但只是部分抵消
第一步
1 1*2*3 1*2*3 1*2*3
--- + ------------ + --------- + ------
100 97*98*99*100 98*99*100 1*2*99*100
第二步
1 1 1 1
--- + ------------ + -------- + -------
100 97*98*33*50 98*33*50 2*33*50
公分母
97*98*33*50*2 + 100*2 + 100*97*2 + 100*97*98
--------------------------------------------
100*97*98*33*50*2
通过分解 100 稍微按摩分子
97*98*33*50*2 + 100*(2*98 + 97*98)
----------------------------------
100*97*98*33*50*2
部分
97*98*33*50*2 100*(2*98 + 97*98)
----------------- + -------------------
100*97*98*33*50*2 100*97*98*33*50*2
取消
1 2*98 + 97*98
--- + --------------
100 97*98*33*50*2
部分
1 2*98 97*98
--- + -------------- + --------------
100 97*98*33*50*2 97*98*33*50*2
取消
1 1 1
--- + -------- + -------
100 97*33*50 33*50*2
我们少了总结,摆脱了98。冲洗并重复,直到找到最终结果:
1
----
97
是的,有时你只需要一支锋利的铅笔和一张白纸;-(
相关文章:
- 在 C++ 中的数组上使用阶乘函数
- 阶乘问题在 c++ 中给出错误的输出
- 大数的阶乘给出错误的输出
- 什么模板用法在阶乘中更好
- 为什么我在C++阶乘函数中出现编译错误?
- 计算阶乘的 C++17 倍表达式中的错误
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 平方模型为零,阶乘模型问题
- 阶乘元规划
- 阶乘-c++ 我想以不同的方式打印
- 阶乘函数只返回C++中输入的答案
- 阶乘使用循环递增给出垃圾值
- 大 n 表示阶乘
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- 计算最大数字的阶乘
- 这个阶乘程序内部发生了什么?
- 返回阶乘C++的递归函数
- C++ 中是否有任何内置阶乘函数?
- 具有大阶乘的数学(例如除法?