标签:include div 等于 ble 信息 出现 精确 重点 click
一.log函数
头文件:
#include <math.h>
使用:
引入#include<cmath>
以e为底:log(exp(n))
以10为底:log10(n)
以m为底:log(n)/log(m)
重点:log()与log10()不是相同的函数
double log(double x); /* 计算一个数字的自然对数 */
double log10(double x); /* 计算以10为基数的对数 */
引申:
lg(1*2*3*4*5*...)=lg1+lg2+lg3+lg4+......;
若要计算sum的对数,假如是以10为底,而sum=1*2*3*4*5*...
则可以:lg(1*2*3*4*5*...)=lg1+lg2+lg3+lg4+......;
例题:poj 1423
数学解法:
#include<iostream> #include<math.h> using namespace std; int num[10000001]; int main() { int n; cin>>n; // lg(1*2*3*4*5*...)=lg1+lg2+lg3+lg4; //其sum的位数是log10(sum)+1; double t=0; for(int i=1;i<=10000000;i++) { t+=log10((double)i); num[i]=(int)t+1;//下标应为整型 } while(n--) { int h; cin>>h; cout<<num[h]<<endl; } }
题目大意:求n的阶乘的位数,即n!的位数
sum=n!,其位数为log10(sum)+1;
相当于log10(1*2*3*4*5*...)=lg1+lg2+lg3+lg4+.....
double t=0;
for(int i=1;i<=n;i++) //得到n的阶乘y log10(x)所得的数有些是小数,定义为double
{
t+=log10((double)i); //注意这里的log10(i)里面的i一定要加一个强制转换,与t的数据类型相同,否则会报错
y=(int)t+1;
}
注意小tips:
1.a[i],数组下标i应为int型,否则会出现compile error
2.y=log10(x),其中y与x的数据类型应相同,否则会出现compile error(错误信息:对重载函数的调用不明确)
二.斯特灵公式
一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用。即使在n很小的时候,斯特灵公式的取值也十分准确。
公式:n!约等于sqrt(2*pi*n)*[(n/e)^n]
n越大精确度越高,我们这只需求n!的位数,所以我们可以用该公式
ac代码:
#include<iostream> #include<cmath> using namespace std; const double e=2.7182818284590452354,pi=3.141592653589793239; double solve(int n) { return (log10(2*pi*n))/2.0+n*(log10(n/e));//这里指数都化为乘积数 } int main() { int t; cin>>t; while(t--) { int n; cin>>n; cout<<(int)solve(n)+1<<endl; } }
标签:include div 等于 ble 信息 出现 精确 重点 click
原文地址:https://www.cnblogs.com/Aiahtwo/p/10518150.html