LOJ N!在不同進製的位數

2022-03-22 19:18:30 字數 1130 閱讀 2491

對於乙個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 ...