hdoj1018_Big Number(大數階乘位數)
阿新 • • 發佈:2019-01-03
題目大意:輸入1~10^7的數字,輸出其階乘結果的位數。 例如10->7
說說解題思路,說大數階乘,立馬想到的是用陣列存結果-_-隨即想到以前做的那道大數階乘數字沒有這麼大,而且也不知道10^7的階乘得開多大陣列,所以只覺得記憶體不夠,開不到這麼大陣列,同時忽略了更直接的一個問題,時間。大數乘法本身耗時,何況是這麼大的數,即使計算出來也超時++了……;
百度求大數階乘位數……發現一個公式,沒忍住看了看推導過程……簡直了……我做題真的不動腦筋……
10^(x-1) <= a < 10^x(則a為x位數)
=> x-1<=log10(a)<x
=> (int)log10(a)=x-1
=> x=(int)log10(a)+1
=> a!的位數 =(int) log10(a!)+1 = (int) log10(1)+log10(2)+……+log10(a)+1
#include<stdio.h> #include<math.h> using namespace std; int main() { int kase; scanf("%d",&kase); while(kase--) { int a; scanf("%d",&a); double x=0; for(int i=1;i<=a;i++) { x+=log10((double)i); } int digit=(int)x +1; printf("%d\n",digit); } return 0; }