hdu--1018--水題-用下斯特林..

來源:互聯網
上載者:User

標籤: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:

  花開不同賞

  花落不同悲

  欲問相思處

  花開花落時

 

 

 

          

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.