时间:2021-05-19
题目描述:
输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2
输入描述:
输入为1行,n(1≤n≤1000)
输出描述:
输出一个整数
样例:
输入:10
输出:2
看到这个题,常规思路就是先把阶乘算出来,再用算出来的结果求余,余数为0则个数加1,代码如下:
#include<iostream>using namespace std;int main(void){ int n, m = 1; cin >> n; for (int i = n; i > 0; i--) { m = m * i; } int sum = 0; int t; for (int i = 0; m > 0; i++) { t = m % 10; m = m / 10; if (t != 0) //要是0前面的数字不是0,则直接结束 { cout << sum; return 0; } else { sum++; } } return 0;}注意一点,就是题目要求是算出末尾的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算进去。
代码如下:
#include<iostream>using namespace std;int main(void){ int n,sum=0; cin>>n; while(n) { sum=sum+n/5; n=n/5; } cout<<sum; return 0;}到此这篇关于用C++实现求N!中末尾0的个数的方法详解的文章就介绍到这了,更多相关C++实现求N!中末尾0的个数内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C++实现汉诺塔的实例详解前言:有A,B,C三塔,N个盘(从小到大编号为1-N)起初都在A塔,现要将N个盘全部移动到C塔(按照河内塔规则),求最少移动次数以及每
python不支持C/C++中的三元操作符?:,替代的方法是...if...else...举例,用下面的语法实现求三个数的最小值。nD1ifnD1<(nD2if
C++实现求小于n的最大素数的实例枚举就是基于已有知识镜像答案猜测的一种问题求解策略问题:求小于n的最大素数分析:找不到一个数学公式,使得根据N就可以计算出这个
本文实例讲述了C++使用递归方法求n阶勒让德多项式的实现方法。分享给大家供大家参考,具体如下:?12345678910111213141516171819202
C++中约数定理的实例详解对于一个大于1正整数n可以分解质因数:n=p1^a1*p2^a2*......pk^ak,则n的正约数的个数就是:(a1+1)*(a2