我正在尝试理解这段代码:
#include<stdio.h>
int main()
{
int j,p,k;
long long int n,i;
scanf("%lld",&n);
for(k=n;k>=1;k--)
{
p=0;
scanf("%lld",&i);
for (j=5;j<=i;j*=5)
{
p=p+i/j;
}
printf("%d\n",p);
}
return 0;
}
解决了这个 Codechef 问题:http://www.codechef.com/problems/FCTRL
我难以理解的是这个循环是如何工作的:
for (j=5;j<=i;j*=5)
{
p=p+i/j;
}
为什么 j 变量设置为 5,如果我将 60 的值赋给 i 变量,有人可以引导我完成这个循环吗?
非常感谢!
简而言之,问题是找出 1
到 1000000000
之间的数的阶乘中零的个数。
现在拿一支铅笔和一张纸。从 1
开始。从 1
到 4
没有 0
。第一个 0
出现在 5!
处。下一个是 10!
,然后是 15!、20!、.....
。这意味着零的数量以 5
为间隔增加。
进入循环
for (j=5;j<=i;j*=5)
{
p=p+i/j;
}
请参阅 i
代表 N
此处(请参阅问题)。由于零的数量以 5
为间隔增加,因此 j
被初始化为 5
并且 j
将递增为5
的倍数。
现在的简单规则是 N!
的十进制表示形式中尾随零的数量就是 中质因数 5
的重数>N!
。
在语句p=p+i/j;
中,遵循同样的规则。程序的作者将 j
递增 5
直到 N/j >= 5
留下 N
(即 i
) 在这里。
N = i = 30
p = 30/5 + 30/(5*5) = 6 // 30/25 is 1 and does not satisfying the condition N/j >= 5
我是一名优秀的程序员,十分优秀!