首页 > 代码库 > hdu_1018(斯大林公式/n!的位数)
hdu_1018(斯大林公式/n!的位数)
题意:求大数n!的位数。
根据n! = (int)log(n!)+1
方法1:
log(n!) = log(1*2*3*...*n) = log1+log2+...+logn
方法2:
斯大林公式:
n! = sqrt(2*PI*n)*(n/e)^n
两侧取对数有
log10(n!) = 1/2log(2*PI*n) + n*log(n/e)
code1:
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 using namespace std; 5 int main() 6 { 7 int n; 8 scanf("%d",&n); 9 int t; 10 while(n--) 11 { 12 scanf("%d",&t); 13 double ans = 0; 14 for(int i = 1; i <= t; i++){ 15 ans+=log10(i); 16 } 17 ans++; 18 printf("%d\n",(int)ans); 19 } 20 return 0; 21 }
code2:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #define e 2.71828182 5 #define PI acos(-1) 6 int main() 7 { 8 int t; 9 int n; 10 double w; //斯特林数 11 scanf("%d",&t); 12 while(t--) 13 { 14 scanf("%d",&n); 15 w=(1.0/2*log10(2*PI*n)+n*log10(n/e)); 16 printf("%d\n",(int) w+1); //记得+1,不能少。 17 } 18 return 0; 19 }
hdu_1018(斯大林公式/n!的位数)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。