題目描述:ios
輸入一個正整數n,求n!(即階乘)末尾有多少個0? 好比: n = 10; n! = 3628800,因此答案爲2spa
輸入描述:code
輸入爲1行,n(1≤n≤1000)blog
輸出描述:ci
輸出一個整數io
樣例:class
輸入:10stream
輸出:2方法
看到這個題,常規思路就是先把階乘算出來,再用算出來的結果求餘,餘數爲0則個數加1,代碼以下:di
1 #include<iostream> 2 using namespace std; 3 int main(void) 4 { 5 int n, m = 1; 6 cin >> n; 7 for (int i = n; i > 0; i--) 8 { 9 m = m * i; 10 } 11 int sum = 0; 12 int t; 13 for (int i = 0; m > 0; i++) 14 { 15 t = m % 10; 16 m = m / 10; 17 if (t != 0) //要是0前面的數字不是0,則直接結束 18 { 19 cout << sum; 20 return 0; 21 } 22 else 23 { 24 sum++; 25 } 26 } 27 return 0; 28 }
注意一點,就是題目要求是算出末尾的0的個數,而不是整個數字中有多少0,因此要注意當餘數不是0的時候就要結束代碼。
可是這樣作實際上是不對的,由於咱們注意到題目的輸入描述爲n(1≤n≤1000),也就是說當n很大的時候,就會越界,超出int表示的範圍。因此也就不能用這種方法進行求解。
正確思路:咱們先看一下末尾的0是怎麼來的:末尾有0,就說明這個數能夠被10整除,而再對10進行因數分解,不難看出10=5*2,而5乘以任何一個偶數,所得結果都會被10整除,因此問題就轉化爲這個階乘裏面含有多少個能被5整除的數字。固然還要注意一點,那就是25,125,625這三個數字,25本質上是2個5(平方),125本質上是3個5(立方),625本質上是4個5(4次方),因此在算到這些數字的時候要把他們自己含有的多的5算進去。
代碼以下:
1 #include<iostream> 2 using namespace std; 3 int main(void) 4 { 5 int n,sum=0; 6 cin>>n; 7 while(n) 8 { 9 sum=sum+n/5; 10 n=n/5; 11 } 12 cout<<sum; 13 return 0; 14 }