階乘的筆試題

2021-06-26 11:13:50 字數 1275 閱讀 4758

(1)n!末尾有多少個0?

這道題可以參考《程式設計之美》2.2節「不要被階乘嚇倒」。

用數學語言描述解法對我來說,太艱難了。我這裡只是舉例子(n=100)加以說明。

方法一:在1~100中,5*2=10, 10*1=10, 15*2=30, 20*1=20, 25*4=100,...100*1=100

這裡注意到,只要是能夠被5整除的數,都會在末尾產生0,其中25和100(其實還有50,75)會在末尾產生2個0。因此,能夠被25(5*5)整除的數會在末尾產生2個0,同理,能夠被125(5*5*5)整除的數會在末尾產生3個0,能夠被5^x整除的數會在末尾產生x個0.

因此方法一的演算法如下:

在1~100中,對於每個能夠被5整除的數(初始值為5,步進為5的所有數都能夠被5整除,至於其他數,因為不能被5整除,所以能在末尾產生0的個數為0,也就不需要考慮),考察能夠被5整除多少次,如75,75/5=15, 15/5=3, 3/5=0, 所以75能夠被5整除2次。

將被5整除的次數加起來就是末尾0的個數。

方法二:100/5=20,也就是1~100中能被5整除的個數有20個,20/5=4,也就是1~100中能被25(5^2)整除的個數有4個,4/5=0,也就是1~100中能夠被125(5^3)整除的個數為0個。20+4+0=24個,所以100!的末尾有24個0.

**如下:

#includeint zero_count1(int n)

} return count;

}int zero_count2(int n)

return count;

}void main()

}

(2)n!有多少位數?

方法一:

若10^x<=n!<=10^(x+1),

那麼n!=k*10^(x),1對式子取常用對數(以10為底的對數),得到:x<=lg(n!)<=(x+1)

lg(n!)=lg1+lg2+lg3+...+lg(n)=x+lg(k),因為1

**如下:

#include#includeint count_wei(int n)

return((int)(x)+1);

}void main()

}

方法二:

斯特林公式如下:

同樣,取對數,可得:lg(n!)約等於1/2*lg(2*pi)+1/2*lg(n)+n*(lg(n)-lg(e)),這個結論可以用來估算

如n=100時,因為10>2*pi,所以1/2*lg(2*pi)<1/2*lg10=0.5,e

筆試題 階乘問題

題幹 題意 給你乙個陣列n 1 n 1e5 讓你輸出有多少數的階乘後恰好有n個0,並依次輸出。型別 二分or暴力 分析 肯定滿足,數字越大,其後的0的個數也就越多。於是我們可以二分出最小的l,使得fac l n 同時我們二分出最大的r,使得fac r n 然後答案就是區間段 l,r 而算fac l ...

筆試題 計算N的階乘

public class test stringbuilder tmpsb new stringbuilder sum for j i j len1 1 0 result add result,tmpsb.tostring else stringbuilder tmpsb new stringbui...

python筆試題 計算n的階乘

計算n!例如n 3 計算3 2 1 6 求10!方法一 可以用python裡面的reduce函式,reduce 函式會對引數序列中元素進行累積 1.用lambda函式 from functools import reduce a 10 b reduce lambda x,y x y,range 1 ...