这个题的意思就是求 N!<2^bit
两边同时取对数,得到 log(N!)<bit*log(2.0),变换形式得到 log(N!)/ log(2.0)<bit;
log(N!)=log(1*2*3*4*……N)=log(1)+log(2)+log(3)+log(4)+……log(N);
则问题转化为求: log(1)/ log(2.0)+ log(2)/ log(2.0)+ log(3)/ log(2.0)+…… log(N)/ log(2.0)<bit
从而避免了大数计算,利用对数直接比较,将问题简单化
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int n,i; 6 __int64 t; 7 double ans; 8 while(scanf("%d",&n),n!=0) 9 { 10 t=(n-1960)/10+2; 11 t=1<<t; 12 i=0; 13 ans=0; 14 while(ans<t) 15 { 16 ans+=log((double)(++i))/log(2.0); 17 } 18 printf("%d\n",i-1); 19 } 20 return 0; 21 }