阶乘应用求n!的位数方法

阶乘应用求n!的位数方法一可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有 M =log10^n!即:M = log10^1+log10^2+log10^3...+log10^n循环求和,就能算得M值,该M是n!的精确位数代码:#include "iostream"#include "math.h"using namespace std;int main(){      int n,i;      double d;      while (scanf("%d",&n)!=EOF){          d=0;          for (i=1;i<=n;i++)d+=(double)log10(i);          printf("%d ",(int)d+1);      }return 0;}  方法二利用斯特林(Stirling)公式的进行求解

下面是推导得到的公式:res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!有关斯特林(Stirling)公式及其相关推导,这里就不进行详细描述,这种方法速度很快就可以得到结果

求n!末尾0的个数思路:一个数 n 的阶乘末尾有多少个 0 取决于从 1 到 n 的各个数的因子中 2 和 5 的个数而 2 的个数是远远多余 5 的个数的, 因此求出 5 的个数即可题解中给出的求解因子 5 的个数的方法是用 n 不断除以 5, 直到结果为 0然后把中间得到的结果累加. 例如, 100/5 = 20, 20/5 = 4, 4/5 = 0则 1 到 100 中因子 5 的个数为 (20 + 4 + 0) = 24 个即 100 的阶乘末尾有 24 个 0. 其实不断除以 5是因为每间隔 5 个数有一个数可以被 5 整除, 然后在这些可被 5 整除的数中每间隔 5 个数又有一个可以被 25 整除, 故要再除一次, ... 直到结果为 0, 表示没有能继续被 5 整除的数了.代码:#include #include using namespace std;int main(){    int N,i,mod5,d5,count0=0;    scanf("%d",&N);    for (i=1;i<=N;i++)    {        mod5=i%5;        d5=i/5;        while(mod5==0)        {            count0++;            mod5=d5%5;            d5=d5/5;        }    }    printf("%d的个数 %d ",N,count0);}

以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。

相关