【例題描述】求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...