杭电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> 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("%dn",(int)sum+1); ??? } ??? return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |