我试图找到包含长度大于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/

10-15 12:51