杭電1018 Big Number
阿新 • • 發佈:2019-01-24
7
19這題當初看題目的時候就挺懵逼,然後用Geogle翻譯翻出來,發現是求輸入的數的階乘的位數,階乘的話用遞迴就能實現,但是輸入的數一大,大數相乘本來就很難實現,而且結果會超出表示範圍,long long也扛不住,怎麼儲存這些中間資料呢,還是懵逼qwq...然後就在discuss中瞭解到:任意一個正整數a的位數等於(int)log10(a) + 1;為什麼呢?下面給大家推導一下: #include <iostream>#include <cmath>using namespace std;int main(){int n;cin>>n;int num;long double result; while(n--){result=0;cin>>num;for(int i=1;i<=num;i++){result+=(log10(i));}cout<<((int)result+1)<<endl;}return 0;} 期間我還遇到一個問題:在for迴圈外我令result=(int)result+1;再輸出result,結果就不對了,想了下,沒想出來咋回事???推薦大神部落格·:http://blog.csdn.net/ld_1090815922/article/details/64248275
對於任意一個給定的正整數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 所以,在這個前提下,求n的階乘的位數就變成了求(int)log10(n*(n-1)*(n-2)*(n-3)...*2*1)+1,又有log10(a*b)=log10(a)+log10(b),所以,該題就變成求
(int)(log10(n)+log10(n-1)+log10(n-2)+...+log10(2)+log10(1))+1,用for迴圈即可實現。