1;大數的階乘後尾0的個數,求0的個數,讓我們想到0就是由2,5的乘積組成,這裡我為什麼沒有把10,100~~~等等,都出來而只單單說只是2,和5的乘積呢,我們先回憶一下,唯一分解定理。
2;唯一分解定理,
概念;任意乙個大於0的正整數都能被表示成若干個素數的乘積且表示方法是唯一的;整理可以將相同素數的合併;可以得到
公式————n = p1^a1 * p2^a2 * …………* (p1 < p2 < ……pn);(這就是標準分解式)
3;然而這是乙個數的階乘與我們這題求某個數階乘沒什麼關係啊,
確實普通的唯一分解定理在這題中確實沒有什麼關係的,但是唯一分解定理也可以拓展,也就是標準式的另外一種形式,與階乘有關的,
4;標準分解式的另外一種寫法;
例如;求29階乘的標準分解式;
不超過29的素數有哪些;2,3,5,7,11,13,17,19,23,29;
就這麼多了,然後我們要做什麼呢,才可以求出29階乘的標準分解式;就是要求出這些素數的冪是好多;
2(29!)//讓它表示29階乘的標準分解式中素數2的冪;其餘類似;
先解釋一下[a]是什麼意思,表示小於a的最大整數;
2(29!) = [29/2^1]+[29/2^2]+[29/2^3]+[29/2^4]
= 14+7+3+1=25;
25就表示29階乘的分解式中素數2的個數;
應該有人有疑問,為什麼只加到29/2^4不在繼續加呢,這裡有什麼特殊的,只加到這裡。當然有特殊的29/2^4=1;如果繼續加也是0啊;因此就加到[29/2^x]==1這裡;
其餘也是這樣
3(29!)= [29/3^1]+[29/3^2]+[29/3^3]=13;
其餘都是這樣的套路可以算出標準式中小於等於29的素數的個數
可以得出;
29!= 2^25 * 3^13 * 5^6 * 7^4 * 11^2 * 13^2 * 17^1 * 19^1 * 23^1 *29^1;這就是拓展唯一分解定理得到的結果;
我們已經把29!的分解式已經求出來了,我們現在可以看出29!尾數0的個數嗎;答案就是6;
5;慢慢的就開始於題目有關了吧;最開始就說過尾數0都是由2和5組成的。意思就是說我們只要把這個數階乘的拓展標準分解式中2和5的個數求出來,那麼0的個數就是2和5個數中小的那個;
是不是突然間恍然大悟了;
然而就可以敲**了;如何把演算法**化就要看現在了;
#include
#include
int main()
kk = n/5;
while(kk != 0)
if(sum2 < sum5)
elseprintf("%d\n",sum5);
}return 0;}
poj1041(某數階乘尾數0的個數)
題意很簡單這裡就不贅述了 這裡主要講一下一些知識點 唯一分解定理,概念 任意乙個大於0的正整數都能被表示成若干個素數的乘積且表示方法是唯一的 整理可以將相同素數的合併 可以得到 公式 n p1 a1 p2 a2 p1 p2 pn 這就是標準分解式 但還有乙個關於階乘的分解式 例如 求29階乘的標準分...
階乘尾數零的個數
100 的尾數有多少個零?為了解決這個問題,必須首先從數學上分析在100 結果值的末尾產生零的條件。不難看出 乙個整數若含有乙個因子5,則必然會在求100 時產生乙個零。因此問題轉化為求1到100這100個整數中包含了多少個因子5。程式說明與注釋 include int main printf th...
演算法精練 高次方數的尾數 階乘尾數零的個數
高次方數的尾數 要求 求133的133次方的最後三位數。利用c c 程式進行設計。演算法設計 由於計算機所能表示的整數範圍有限,直接乘的方法顯然是不可能得到正確的結果。但事實上,題目只要求保留後三位,完全沒有必要求出完整結果。因此 通過研究乘法的規律可以發現,乘積的後三位的值只與乘數與被乘數的後三位...