1. 程式人生 > >hdoj1018_Big Number(大數階乘位數)

hdoj1018_Big Number(大數階乘位數)

題目大意:輸入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;
}