用C++实现:末尾0的个数

题目描述: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 }
相关文章
相关标签/搜索