求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;
}
浙公网安备 33010602011771号