用C++實現:末尾0的個數


題目描述:

輸入一個正整數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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM