很多天没有更新自己的Blog了,前几天拿到一个题目.就是写一段程序计算10000的阶乘.当时我还以为这题目非常简单,没想到还是需要动点大脑的.花了将近半个小时才搞定,拿出来分享一下. 
   为什么不能用普通的方法来写呢,比如说递归?在我的教科书上可是用的是递归呀?不知道你注意没有,如果是100的阶乘的话,其结果肯定是非常大的,以我们现有语言的数据类型肯定是没法使用的,就拿C来说,long型能存的下10000的阶乘吗?未必.所以我就使用数组来存储结果的每一位,然后输出每一位不就是结果吗.
  那么具体怎样去做?
  首先确定结果的位数?如何确定呢?请看下面.
  2!=1*2<=10*10
  3!=1*2*3<=10*10*10
.......
所以我们可以得出一个结论
          n!<=10
n
所以n!的位数可以这样计算:
两边取对数,即log10n!<=log1010n

两边n>=Log101+Log102+Log10 3+....Log10 n
这样n!的位数肯定等于小于Log101+Log102+Log10 3+....Log10 n.

以上是错误的
正确的推断如下:

可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,
对该式两边取对数,有=log10^n!即:
M = log10^1+log10^2+log10^3...+log10^n
循环求和,就能算得M值,该M是n!的精确位数。


位数的确定解决之后,就看看如何计算了.
看看如下代码:

 110000的阶乘的算法(大数的阶乘) [转]int index=0;
 210000的阶乘的算法(大数的阶乘) [转]    long carrier=0;
 310000的阶乘的算法(大数的阶乘) [转]    double bitCount = 1
 410000的阶乘的算法(大数的阶乘) [转]    int begin = 0
 510000的阶乘的算法(大数的阶乘) [转]  
 610000的阶乘的算法(大数的阶乘) [转]    for(index=2; index<=n; ++index) 
 7 

这里就是计算的关键了.注意一下进位问题即可.所有代码如下:

  110000的阶乘的算法(大数的阶乘) [转]
  2
好了,不说了.
下载代码


本贴转自:http://confach.cnblogs.com/archive/2005/07/14/192703.html

相关文章:

  • 2022-02-21
  • 2022-12-23
  • 2022-01-19
  • 2022-12-23
  • 2022-12-23
  • 2022-02-14
  • 2021-07-17
猜你喜欢
  • 2021-12-17
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-03
  • 2021-06-22
相关资源
相似解决方案