對於乙個b進製的數,只需要對其取以b的對數就可以得到他在b進製情況下的位數(取了對數之後可能為小數,所以還需要取整後再+1)
— n ! 的位數就是 [lg(n!)]+1=[lg(1)+lg(2)+…+lg(n)]+1
—=(int)ceil[(n*ln(n)-n+0.5*ln(2*n*π))/ln(10)] /*ceil是向上取整,符號為取整*/
— 最後乙個式子被稱為斯特林公式
cin>>n;cout
<
【換底公式:logx (n!) = log(n!) / log(x)】
【階乘變加法:log (n!)=log1 + log2 + log3 + log4 +……+log(n),】
n !在10進製下的位數為log10 (n!) + 1; 所以在x進製下的位數為logx (n!) + 1;
但是計算機只能表示以10和e為底的對數,所以要用換底公式,logx (n!) = log(n!) / log(x);【注意,等號右邊的 log 都是預設以e為底】
log (n!)=log1 + log2 + log3 + log4 +……+log(n), 所以n比較大時計算log(n!)時已經把其他數的階乘也算出來了,
如果給出乙個n都要計算階乘的話,費時間o(n),所以可以把 log (n!) 先用double型陣列sum先存起來,令sun[i]=log(i!)
先預處理出sum[i]後面可直接呼叫;
#include#include
#include
double sum[1000009];//
陣列要是double型的;
intmain()
int t,n,b,mm=1
; scanf("%d
",&t);
while(t--)
else
} return
0;
}
不同進製數字轉換
將十進位制數轉換為二進位制 defdec2bin dec if checkdec dec return str bin int dec 將十進位制數轉換為八進位制 defdec2oct dec if checkdec dec return str oct int dec 將十進位制數轉換為十六進製制...
不同進製間的轉換
1 其他進製到十進位制 係數 就是每乙個位上的數值 基數 x進製的基數就是x 權 對每乙個位上的資料,從右,並且從0開始編號,對應的編號就是該資料的權。結果 係數 基數 權次冪之和。2 十進位製到其他進製 除基取餘,直到商為0,餘數反轉。3 進製轉換的快速轉換法 a 十進位制和二進位制間的轉換 84...
不同進製的表現形式
對於乙個整型資料型別,我們已經習慣他的十進位制表達方式,即直接寫對應的數學表達就行,但是某些時候我們可能要用到其他的進製來表達,比如二進位制,八進位制和十六機制,如何告知程式我這裡是其他進製而不是十進位制呢。ps x表示數字位 二進位制字首表達 0b x 比如int i 2轉換成2進製表達為int ...