杭电OJ【1018】Big Number 大数阶乘位数



思路分析:

求大数阶乘位数问题,如果n较大的时候,n!必然是一个很大的数。

任意一个数a的位数等于long10(a)+1

推导过程如下:

如果 10^(x-1)<=a<10^x,则a必然是一个x位数。

则 ln(10^(x-1))<=ln(a)<ln(10^x),即x-1<=ln(a)<x,则(int)ln(a)=x-1,得到x=(int)ln(a)+1。

所以a的位数是(int)ln(a)+1。

假设A=n!=1*2*3*……*n=(int)ln(1*2*3*……*n)+1=(int)(ln(1)+ln(2)+ln(3)+……+ln(n))+1。

所以n!=(int)(ln1+ln2+……+lnn)+1


代码

#include<stdio.h>
#include<math.h>

int main() {     int n;     scanf("%d",&n);     while(n--)     {         int m,i;         double sum=0;         scanf("%d",&m);         for(i=1;i<=m;i++)         {             sum+=(log10(i));         }         printf("%d\n",(int)sum+1);     }     return 0; }

相关文章

自1998年我国取消了福利分房的政策后,房地产市场迅速开展蓬...
文章目录获取数据查看数据结构获取数据下载数据可以直接通过...
网上商城系统MySql数据库设计
26个来源的气象数据获取代码
在进入21世纪以来,中国电信业告别了20世纪最后阶段的高速发...