求100!的精确值

  初看此题觉得用个递归或循环就能解决这个问题,显然自己功力不够深厚。细想才知道这个数已经超过int或long型的表示范围了。这个问题遇到后直接先上网查了下自己也没怎么想。现在总结一下:

  1.先算出阶乘结果的位数。这个利用log函数,可以将n!表示成10的次幂,即n!=10^M(10的M次方),不小于M的整数就是结果的位数,这里M为小数,如果M=1.345,那么结果位数为2.怎么算来的呢。就是对n!=10^M取对数得:M=log10(n!)=log10(1)+log10(2)+...+log10(n);

  2.算出位数后,建立一个数组,用此数组来装结果的每一位数。比如下标0的存个位上的数字,为1的存十位上的数字,如此。

  3.这一步就是来计算每位数上的值了。这个就不难了,计算时加好进位的值就好。

  下面给出我写的程序,菜鸟写程序,有不足的欢迎指正批评!

#include <iostream>
#include <math.h>
using namespace std;

const int NUM = 100;//设置要计算阶乘的数

int main()
{
  int n = 0, i = 0, a[512] = {0};
  int carry = 0;//进位数
  double m = 0.0;

  for (n = NUM; n>0; n--)//算出结果含有的位数
    m += (log(n)/log(10));
  a[0] = 1;//我这里设置下标为0的存个数上的数值,初始值为1;
  for (n = 1; n<=NUM; n++)
  {
    carry = 0;
    for (i=0; i<m+1; i++)
    {
      a[i] = carry + a[i] * n;
      carry = a[i]/10;
      a[i] = a[i]%10;
    }
  }

  for (i = m; i>=0 ; i--)//输出结果
  {
    cout<<a[i];
  }
  cout<<endl;
  return 0;
}

  

posted on 2012-10-20 16:09  Mr_李  阅读(684)  评论(6)    收藏  举报

导航