一.log函式
標頭檔案:
#include
使用:
引入#include
以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#includeview codeusing
namespace
std;
int num[10000001
];int
main()
while(n--)
}
題目大意:求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很小的時候,斯特靈公式的取值也十分準確。
公式:n!約等於sqrt(2*pi*n)*[(n/e)^n]
n越大精確度越高,我們這只需求n!的位數,所以我們可以用該公式
ac**:
#include#includeview codeusing
namespace
std;
const
double e=2.7182818284590452354,pi=3.141592653589793239
;double solve(int
n)int
main()
}
Big Number階乘位數計算 斯特林公式
題目大致意思是輸入乙個t,然後接下來t行中輸入n並計算每一行中n的階乘的位數 解題思路 如果此題不是大數的話可以用對數函式性質 log10 1 2 3 4 5.log10 1 log10 2 附上 注意sum是double int main if n 1 sum 1 cout 向上取整函式 retu...
斯特林公式與階乘
想必大家都知道n!很容易爆long long吧,n 23時 unsigned long long 也束手無策。但很多時候我們又要用到n!1 牛客網 題意 求n!在8進製下的位數。思路 我們求乙個10進製數的位數時怎麼求,log10 n 1就是答案。同理,log8 n 1就是此題的解。ac inclu...
A 不凡的夫夫(階乘位數 斯特林公式)
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 夫夫有一天對乙個數有多少位數感興趣,但是他又不想跟凡夫俗子一樣,所以他想知道給乙個整數n,求n!的在8進製下的位數是多少位。第一行是乙個整數t 0示例1 3 425 2...