(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 ...