題目大致意思是輸入乙個t,然後接下來t行中輸入n並計算每一行中n的階乘的位數
解題思路:如果此題不是大數的話可以用對數函式性質:log10(1*2*3*4*5...)=log10(1)+log10(2)...
附上**,注意sum是double
int結果就tle了。。。main()
}if(n==1) sum=1
; cout
/向上取整函式
}
return0;
}
正解是用斯特林公式:
附上**:
const斯特林公式更精確方法:double pi=3.141592654
;const
double e=2.71828182846
;int
t,n;
intmain()
return0;
}
另一種思路的好方法(或許是吧。。。):
大數階乘的位數
問題 c 階乘位數 時間限制 1 sec 記憶體限制 128 mb 提交 狀態 題目描述 在很多軟體中需要用到較大的整數。比如一些軟體將大數用於資料安全傳送的密匙或者密碼編譯等等。在這個問題中,你要根據給你的整數,算出這個數的階乘的位數。輸入含若干行整數。第一行為n,表示案例數,接下來是n行,每行乙...
計算乙個數階乘的位數
給出乙個數n,求出n!的位數。暴力法肯定是不行的,階乘是個增長速度 很快的函式,10!已經有7位了。更直接的方法是log10 n 以10為底n 的對數。因為求位數就是要每次除以10 的,取對數的意義就是10的幾次方才能到n 也就是求了n 有幾位。那麼問題就轉化成求log10 n 了 一種方法是換底公...
HDOJ 1018(階乘位數)
1.log10 num 1 2.較小數情況下,sprintf str,d num 輸出strlen str 所以不能初始化為0 自然對數 log 以二為底log2 num log num log2,因為那個自然對數的底是無理數,不好表示,只要有了自然對數的表示,其他用換底公式就ok啦 我一直想的是求...