我试图找到包含长度大于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++ - 具有大阶乘的数学(例如除法?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27386984/