gpt4 book ai didi

c - 这个 C 中的 Codechef 阶乘解是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:19 26 4
gpt4 key购买 nike

我正在尝试理解这段代码:

#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 变量,有人可以引导我完成这个循环吗?

非常感谢!

最佳答案

简而言之,问题是找出 11000000000 之间的数的阶乘中零的个数。
现在拿一支铅笔和一张纸。从 1 开始。从 14 没有 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

关于c - 这个 C 中的 Codechef 阶乘解是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22504271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com