题目描述:
输入一个正整数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 }
原文链接: https://www.cnblogs.com/guanrongda-KaguraSakura/p/13305442.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/366346
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!