微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

杭电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; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐