求0的個數

2021-09-11 19:43:00 字數 1367 閱讀 6355

例題描述】求0的個數

求1* 2 * 3 * 4*… * n所得數末尾有多少個0?

樣例輸入

5【樣例輸出

1方法一:

採用從1乘到n,每乘一次進行一次判斷,若後面有零則去掉後面的0,並記下掉的0的個數,

並且為了不超過數的表示範圍,去掉前面與0有關的數,只保留三位有效數字。

#include

using namespace std;

int i,ii,n;

long sum;

intmain()

sum=sum%

1000

;//保留三位有效數字

} cout

}//個人感覺第一種方法並不適用不是全排列的情況

方法二:

由於影響生成0的數只有2和5的倍數,並且真正影響生成0的是5的倍數,顯然這些數的分解數含因子2的數顯然多於因子5

的數因此我們可以得出這樣的乙個結論:n!的分解數中有多少個因子就有多少個5,末尾就有多少個0。這樣使得外面

的大迴圈減少五分之四。

//求n!後面零的個數,該方法的外迴圈需要n/5次

#include

using namespace std;

intmain()

j+=5

;//5的等差數列

} cout<}

方法三:

直接求取5的個數,使用層層剝皮法,先以5為步長,執行一次迴圈,進行第一次剝皮求出含5的個數(個數為n/5取整),再

以25為步長(因為有的書可以被5整除兩次),執行第二次迴圈,進行第二次剝皮求出25的個數,再以125為步長…直到

步長大於等於n退出迴圈。例如當n=1000時,寫成公式為num=1000/5+1000/(55)+1000/(555)+1000/(5555).[^1]

//求n!後面零的個數,方法3僅需sqrt(n)次迴圈

分析:該方法的巧妙之處就在於1000/5的得數也包含了1000/25中的乙個因數5,這樣25這個位置就累加了兩次。

所需無需考慮重複使用,反而起到了累加的作用。

#include

using namespace std;

int i,ii,n;

intmain()

cout

}

總結:這三種方法都是建立在2的倍數多餘5的前提下的,如果不是全排列則先需要進行判斷。

9 求階乘結果0的個數

編寫乙個程式,求出n!的末尾含有多少個0。你的資料需要從標準輸入裝置 通常為鍵盤 中讀入多組測試資料。每組輸入資料由一行組成,每行由乙個正整數n組成,n小於等於100000,在行首和行尾沒有多餘的空格。對每組測試資料,你的程式需要向標準輸出檔案 通常為啟動該程式的文字終端 依次輸出一組對應的答案。所...

13 求階乘結果0的個數

13 求階乘結果0的個數 時間限制 1s章節 迴圈 問題描述 你的資料需要從標準輸入裝置 通常為鍵盤 中讀入多組測試資料。每組輸入資料由一行組成,每行由乙個正整數n組成,n小於等於100000,在行首和行尾沒有多餘的空格。輸出說明 對每組測試資料,你的程式需要向標準輸出檔案 通常為啟動該程式的文字終...

求n的階層末尾0的個數

統計n的階層的末尾0的個數 思路 1 設 n!k 10 m,且k不能被10整除,那麼n!末尾有 m個0 2 再考慮對n!進行質因數分解,n!2 x 3 y 5 z 因為 10 2 5,所以 m 只跟 x 和 z 有關,每一對2和5得到乙個10 於是m min x,z 不難看出x顯然大於z,因為能被2...