標籤:style blog http color os io for art
很水的一題...
計算階乘的位元..
touch me
斯特林公式:
或更精確的或 我一開始是不知道這個公式 所以用了自己的方法 就是簡單利用下 log(x*y)=logx+logy==============log(1*2*3....*n)=log1+log2+log3+....+logn看到一篇對於這個 介紹的不錯的公式依據
/****************************************************這題要求n的階乘的位元,如果n較大時,n的階乘必將是一個很大的數,題中說1<=n<10000000,當n=10000000時可以說n的階乘將是一個非常巨大的數字,對於處理大數的問題,我們一般用字串,這題當n取最大值時,就是一千萬個數字相乘的積,太大了,就算儲存在字串中都有一點困難,而且一千萬個數字相乘是會涉及到大數的乘法,大數的乘法是比較耗時的,就算計算出結果一般也會逾時。這讓我們不得不拋棄這種直接的方法。再想一下,這題是要求n的階乘的位元,而n的階乘是n個數的乘積,那麼要是我們能把這個問題分解就好了。在這之前,我們必須要知道一個知識,任意一個正整數a的位元等於(int)log10(a) + 1;為什麼呢?下面給大家推導一下: 對於任意一個給定的正整數a, 假設10^(x-1)<=a<10^x,那麼顯然a的位元為x位, 又因為 log10(10^(x-1))<=log10(a)<(log10(10^x)) 即x-1<=log10(a)<x 則(int)log10(a)=x-1, 即(int)log10(a)+1=x 即a的位元是(int)log10(a)+1我們知道了一個正整數a的位元等於(int)log10(a) + 1,現在來求n的階乘的位元:假設A=n!=1*2*3*......*n,那麼我們要求的就是(int)log10(A)+1,而:log10(A) =log10(1*2*3*......n) (根據log10(a*b) = log10(a) + log10(b)有) =log10(1)+log10(2)+log10(3)+......+log10(n)現在我們終於找到方法,問題解決了,我們將求n的階乘的位元分解成了求n個數對10取對數的和,並且對於其中任意一個數,都在正常的數字範圍之類。總結一下:n的階乘的位元等於 (int)(log10(1)+log10(2)+log10(3)+......+log10(n)) + 1根據這個思路我們很容易寫出程式****************************************************/
---》稍微有點長 但講得很細緻
1 #include <iostream> 2 #include<math.h> 3 using namespace std; 4 5 #define PI 3.141592657 6 #define E 2.71828182845904523536028747135266250 7 8 int main() 9 {10 int t , n;11 double cnt;12 while( cin >> t )13 {14 while( t-- )15 {16 cin>>n;17 cnt = log10( sqrt( 2*PI*n ) ) + n * log10(n/E);18 cout << (int)(cnt+1) << endl;19 }20 }21 return 0;22 }View Code
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 int main() 6 { 7 cin.sync_with_stdio(false); 8 int t , n; 9 double cnt;10 while( cin >> t )11 {12 while( t-- )13 {14 cnt = 0;15 cin >> n;16 for( int i = 1 ; i<=n ; i++ )17 {18 cnt += log10(i*1.0);19 }20 cout << (int)(cnt+1) << endl;21 }22 }23 return 0;24 }View Code
today:
花開不同賞
花落不同悲
欲問相思處
花開花落時