• 大数阶乘位数问题 void


    斯特林[striling]公式(求阶乘(n!)的位数)
    2007-10-05 13:49
    /*例如1000阶乘位数:
    log10(1)+log10(2)+···+log10(1000)取整后加1
    */
    #include
    <stdio.h>
    #include
    <math.h>
    int main()
    {
    int n,i,t;
    double d;
    scanf(
    "%d",&t);
    while(t--)
    {
    while(scanf("%d",&n))
    {
    d
    =0;
    for(i=1;i<=n;i++)
    d
    +=log10(i);
    printf(
    "%d\n",(int) d+1);
    }
    }
    return 0;
    }
    /*


    #include<stdio.h>
    #include<math.h>
    #define PI 3.14159265
    int main(){
    int len,N;
    while(scanf("%d",&N)!=EOF)
    {
    if(N==1)
    len=1;
    else
    len=(int)ceil((N*log(N)-N+log(2*N*PI)/2)/log(10));////ceil求上界,即不小于某值的最小整数
    //string公式lnN!=NlnN-N +0.5*ln( 2*N*pi)
    //而N次方阶乘的位数等于:
    // log10(N!)取整后加1
    // log10(N!)=lnN!/ln(10)

    //ceil为求上界,即不小n的最小整数
    //log取自然对数
    printf("%d\n",len);
    }
    return 0;
    }
    精度计算——大数阶乘

    语法:
    int result=factorial(int n);

    参数:

    n:
    n 的阶乘

    返回值:
    阶乘结果的位数

    注意:



    本程序直接输出n
    !的结果,需要返回结果请保留long a[]


    需要 math.h

    源程序:



    int factorial(int n)
    {
    long a[10000];
    int i,j,l,c,m=0,w;

    a[
    0]=1;
    for(i=1;i<=n;i++)
    {
    c
    =0;
    for(j=0;j<=m;j++)
    {
    a[j]
    =a[j]*i+c;
    c
    =a[j]/10000;
    a[j]
    =a[j]%10000;
    }
    if(c>0) {m++;a[m]=c;}
    }

    w
    =m*4+log10(a[m])+1;
    printf(
    "\n%ld",a[m]);
    for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);
    return w;
    }
  • 相关阅读:
    java 面向对象(二十二):关键字:final
    The Loss of Bounding Box Regression
    五大经典算法
    二叉树的深度优先遍历(前序、中序、后序)
    faster R-CNN中anchors 的生成过程
    快速排序
    __init__()
    好博客
    Focal Loss for Dense Object Detection(RetinaNet)(代码解析)
    Python获取 当前目录、上一级目录
  • 原文地址:https://www.cnblogs.com/void/p/2034203.html
Copyright © 2020-2023  润新知