題目描述:
輸入一個正整數n,求n!(即階乘)末尾有多少個0? 比如: n = 10; n! = 3628800,所以答案為2
輸入描述:
輸入為1行,n(1≤n≤1000)
輸出描述:
輸出一個整數
樣例:
輸入:10
輸出:2
看到這個題,常規思路就是先把階乘算出來,再用算出來的結果求余,余數為0則個數加1,代碼如下:
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 }