1. 程式人生 > >斯特林公式

斯特林公式

... mage 斯特林公式 amp int stdout 進制 %d 問題

先想一個簡單的問題

  讓你去求一個任意一個數 x 在 a 進制下的位數, 那麽答案就是 log(a)(x) + 1, (以 a 為底 x 的對數 + 1 )

現在讓你去求 n! 在 a 進制下的位數 答案就是 log(a)( n! ) = log(a)(1*2*3*...*n) = log(a)(1) + log(a)(2) + log(a)(3) + ... + log(a)(n) . 最後在取整 + 1

這種做法的復雜度是 n *log n ,當 n 很大時顯然是不可取的,斯特林公示是對此的一個優化

int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    int x;
    
    while(~scanf("%d", &x)){
        double ans = 0;
        int s = 1;
        for(int i = 1; i <= x; i++){
            ans += log10(i);
            s *= i;
        }        
        printf("%d  ", s);
        printf("%d\n", (int)(ans)+1);
    }
    return 0;
}

斯特林公式

技術分享圖片

在這邊 pi = acos(-1.0) e = exp(1.0) ;

斯特林公式