我试图找到包含长度超过50的循环的100个数字的排列的百分比。这涉及数学包括具有大因子的除法,这不能用手很快完成,所以我需要求助编程。例如,这些术语包含
(3!/ 100!)*((99!/ 3!)+(98!/ 2!)+(97!/ 1!)+(96!/ 0!))
我可以重新安排所有条款,以提供一个只需要除以100的大数字(> 2 ^ 64)!得到我的答案。
我已经考虑了很多,仍然是C ++的新手,而且我不确定如何用大数字进行划分。通常当我处理大型因子时,我会将数字的数字输出到数组并通过它进行乘法,但我不完全确定如何以这种方式进行除法。在C ++中处理大数学数学的最佳方法是什么?
答案 0 :(得分:0)
从等式的结构(非常大的因子的倒数乘以具有大约相同幅度的一些大因子)可以看出,可以发生大量的消除。这意味着这个问题可以通过一些非常简单的代数来解决,并且即使没有任何计算也可以带来一些额外的运气。
让我们用一些无辜的小字母取代阶乘,以避免大数字的恐吓。
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
Yepp,看起来不错,我们可以把数字放回
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
我们减去了summand并摆脱了98.冲洗并重复,直到找到最终结果:
1
----
97
是的,有时你需要一支锋利的铅笔和一张白纸; - )