[英]Mathematics with large factorials (e.g. division?)
我試圖找到包含長度大於50的循環的100個數字的置換百分比。這涉及數學與大階乘的除法運算,這不能很快地手動完成,因此我需要求助於編程。 例如,這些術語包含
(3!/ 100!)*((99!/ 3!)+(98!/ 2!)+(97!/ 1!)+(96!/ 0!))
我可以重新排列所有術語以提供一個大數(> 2 ^ 64),只需將其除以100! 得到我的答案。
我想了很多,仍然是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
是的,有時只需要一支鉛筆和一張空白紙;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.