階乘數小的時候可以直接計算。
例如:求10!後面零的個數。很明顯結果為3628800。 0的個數為2個。
20!結果為2432902008176640000,0的個數為4個。而這個時候已經達到19位數了。
更大的數,如果再直接去求。顯然太麻煩了。
那麼,在這裡,介紹一種求階乘結果後面零的個數的方法。
首先,出現零的情況就是 5 的倍數乘以偶數。
但是出現0的個數就不一定了,2*5=10 出現乙個0。4*25=100會出現2個0。8*125=1000出現3個0.依次類推。
大家不難發現規律所在。4*25可以分解成2*5*2*5,8*125可以分解為2*5*2*5*2*5........
至於10,15,20 這些數 。 分解開,只會出現乙個5,也就只會出現1個0。
至於50,75這些25的倍數,分解開,也只會出現2個5,與偶數相乘也只會出現2個0.
下面就是計算0的個數了。
上面也談到了,偶數乘以5會出現乙個0,乘以5的平方會出現2個0,乘以5的立方會出現3個0.
那麼怎麼計算階乘裡存在多少個5的倍數,25的倍數,125的倍數呢。而且,有個問題還需要注意,25,125也是5的倍數,125也是25的倍數。
例如 求100!後面0的個數。
由上所說的方法,是5的倍數的數有16(除去25的倍數),是25的倍數的數有4個,結果應該為16*1+4*2=24個0.
我們也可以換一種思維,出現乙個5就是乙個0,那麼出現乙個25就是2個0,如果5的倍數不排除25的倍數的話,每出現乙個25的倍數,只加上1個0即可。
換句話說就是,0的個數就等於5的倍數的個數加上25的倍數的個數,即 20+4。
如果是求2016!後面0的個數呢?
同樣按照上面的方法。
5的倍數個數為: 2016/5 = 403個
25的倍數個數為: 403/5 = 80個
125的倍數的個數為:80/5 = 16個
625的倍數的個數為: 16/5 = 3個。
所以可以得出2016!後面0的個數為:403+80+16+3 = 502個.
如何用**又該如何實現呢?
很簡單,用乙個簡單的迴圈就能解決,當然遞迴演算法更好。這裡我們就只貼迴圈的**了。
scanner scanner = new scanner(system.in);
system.out.print("請輸入階乘數:");
int a = scanner.nextint();
int count= 0;
for (; ;) else
}system.out.println("階乘結果後面的零的個數為:"+count);
結果如下:
請輸入階乘數:2016
階乘結果後面的零的個數為:502
當然,重在思想,**沒有什麼好說的。希望大家也學到了這個方法。雖然在在生活中用處不大,但是轉換思想的方法還是挺管用的。
階乘尾數零的個數
100 的尾數有多少個零?為了解決這個問題,必須首先從數學上分析在100 結果值的末尾產生零的條件。不難看出 乙個整數若含有乙個因子5,則必然會在求100 時產生乙個零。因此問題轉化為求1到100這100個整數中包含了多少個因子5。程式說明與注釋 include int main printf th...
階乘末尾零的個數
請設計乙個演算法,計算n的階乘有多少個尾隨零。給定乙個int n,請返回n的階乘的尾零個數。保證n為正整數。測試樣例 5返回 1 思路 對n 進行質因數分解,n 2的x次方 3的y次方 5的z次方 因為10 2 5,所以末尾零的個數只與x和z相關,每一對2和5相乘可以得到乙個10,因為x大於等於z,...
階乘末尾零的個數
求乙個數的階乘末尾零的個數。數學結論題。如果你去求階乘再去求末尾零的個數,累死你,給你10000,你就得寫高精度了。顯然暴力不是正解。我們換個角度。末尾的 0 是怎麼來的?顯然,二五一十啊。乙個二乙個五,乙個十。進一步想,二咋來的,5咋來的?一堆數相乘,2多了去了,每個偶數都有至少乙個2.再看5。顯...