现在的位置: 首页 > 综合 > 正文

大数阶乘算法思想,具体实现网上很多,也顺便找了个算法思想

2012年11月09日 ⁄ 综合 ⁄ 共 1173字 ⁄ 字号 评论关闭

 首先,定义两个整型的数组:
int fac[1000];//暂且先设定是1000位,我称之为“结果数组”

int add[1000];//我称之为“进位数组”

现在具体说明两个数组的作用:

1.fac[1000]

比如说,一个数5的阶乘是120,那么我就用这个数组存储它:
fac[0]=0
fac[1]=2
fac[2]=1

现在明白了数组fac的作用了吧。用这样的数组我们可以放阶乘后结果是1000位的数。

2.在介绍add[1000]之前,我介绍一下算法的思想,就以6!为例:
 从上面我们知道了5!是怎样存储的。

 就在5!的基础上来计算6!,演示如下:

fac[0]=fac[0]*6=0
fac[1]=fac[1]*6=12

fac[2]=fac[2]*6=6

3.现在就用到了我们的:“进位数组”add[1000].

 先得说明一下:add就是在第2步中用算出的结果中,第i位向第i+1位的进位数值。还是接上例:
add[0]=0;

add[1]=1;  // 计算过程:就是 (fac[1]+add[0])  %  10=1

add[2]=0;  // 计算过程:就是 (fac[2]+add[1]) % 10=0
.......
.......

.......

add[i+1] =( fac[i+1] + add ) % 10

现在就知道了我们的数组add[]是干什么的了吧,并且明白了add是如何求得的了吧。

4.知道了add[1000]的值,现在就在 1. 和 3 . 两步的基础上来计算最终的结果。(第2步仅作为我们理解的步骤,我们下面的计算已经包含了它)

fac[0] = ( fac[0]*6 )  mod 10 =0 

fac[1] = ( fac[1]*6 + add[0] ) mod 10 =2

fac[2] = ( fac[2]*6 + add[1] ) mod 10=7

到这里我们已经计算完了6!。然后就可以将数组fac[1000]中的数,以字符的形式按位输出到屏幕上了。

5.还有一点需要说明,就是我们需要一个变量来记录fac[1000]中实际用到了几位,比如5!用了前3位;
我们在这里定义为 top 

      为了计算top,我们有用到了add[1000],还是以上面的为例:
    

    5!时,top=3,在此基础上我们来看6!时top=?
      由于  add[2]=0

      所以  top=3(没有变)
也就是说,如果最高位有进位时,我们的top=top+1,否则,top值不变。

6.总结一下,可以发现,我们把阶乘转化为 两个10以内的数的乘法,还有两个10以内的数的家法了。

  因此,不管再大的数,基本上都能算出了,只要你的数组够大就行了。

 

from:http://www.chinaunix.net/jh/23/312721.html


抱歉!评论已关闭.