刷leetcode
遇到此题,明白直接求n!
是不行的,必然会导致溢出。转变思想之后,发现n=n x (n-1) x (n-2) x ... x10 x 9 x ... x 2
,只要书橱,这里面因子5
和因子2
的个数,就知道了零的个数了。又由于因子2
的个数远大于因子5
的个数,因此,只需要数出因子5的个数即可。而因子5
的个数,刚好是n中包含5的个数,加上包含25的个数,再加上包含125的个数一直加到5^[log5(n)]时
构思以下代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d", &n);
int count=0;
int factor =5;
while(n >= factor)
{
count += n/factor;
factor *= 5;
}
}
上述代码在n
较小时,结果正确,而在n=1808548329
时,结果错误。在 debug
之后发现存在溢出,如下图所示
![](https://img.haomeiwen.com/i1095290/3e60541080754488.png)
当把
factor
类型改为long long
时,以上问题得到解决。在提交之后,发现一种更好的代码的实现
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d", &n);
int count=0;
while(n)
{
count += n/5;
n/=5;
}
printf("%d\n",count);
}
这种方法使用除法运算代替了乘法运算,保证了运算过程不会发生溢出。
通过这个问题的求解,似乎可以得到以下结论:
- 不加限制的连续乘法会导致溢出,可以想办法将乘法运算转变为除法运算。
网友评论