加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 02:31:39 所属栏目:大数据 来源:网络整理
导读:?? 思路分析: 求大数阶乘位数问题,如果n较大的时候,n!必然是一个很大的数。 任意一个数a的位数等于long10(a)+1 推导过程如下: 如果 10^(x-1)=a10^x,则a必然是一个x位数。 则 ln(10^(x-1))=ln(a)ln(10^x),即x-1=ln(a)x,则(int)ln(a)=x-1,得到x=(int)l
??

思路分析:

求大数阶乘位数问题,如果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("%dn",(int)sum+1); ??? } ??? return 0; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读