C中的这个Codechef阶乘解决方案是如何工作的?

C中的这个Codechef阶乘解决方案是如何工作的?,c,C,我正试图理解这段代码是如何: #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) {

我正试图理解这段代码是如何:

#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;
} 
#包括
int main()
{
int j,p,k;
long-long-int n,i;
scanf(“%lld”、&n);
对于(k=n;k>=1;k--)
{
p=0;
scanf(“%lld”、&i);
对于(j=5;j这段代码:

p=0;
scanf("%lld",&i);
for (j=5;j<=i;j*=5)
{
    p=p+i/j;
}
p=0;
scanf(“%lld”、&i);
对于(j=5;j这段代码:

p=0;
scanf("%lld",&i);
for (j=5;j<=i;j*=5)
{
    p=p+i/j;
}
p=0;
scanf(“%lld”、&i);

简言之,对于(j=5;j而言,问题在于找到介于
1
100000000
之间的数的阶乘的零个数
现在拿一支铅笔和一张纸。从
1
开始。从
1
4
没有
0
。首先
0
出现在
5!
处。接下来是
10!
处,然后是
15!、20!、…
。这意味着零的数量在
5的间隔处增加

进入循环

for (j=5;j<=i;j*=5)
{
      p=p+i/j;
}

简言之,问题在于找到介于
1
100000000
之间的数字阶乘的零个数
现在拿一支铅笔和一张纸。从
1
开始。从
1
4
没有
0
。首先
0
出现在
5!
处。接下来是
10!
处,然后是
15!、20!、…
。这意味着零的数量在
5的间隔处增加

进入循环

for (j=5;j<=i;j*=5)
{
      p=p+i/j;
}

如果您了解他们用于查找中和中概述的阶乘的尾随零的数量的方法,则此算法更有意义。基本上取决于您需要考虑阶乘展开中
5
2
的所有乘积以发现t中将有多少零他结束了

查找
x!
中尾随零数的算法归结为:

  • 查找
    5的连续幂
  • x
    除以结果,将截断的结果添加到总数中
  • 当除法结果小于
    1
    时停止,或者在这种特定情况下,我们知道当结果大于
    x

  • 因此,如果回到代码,我们可以找到以下步骤:

             step 3
             |    step 1
             V    V
    for (j=5;j<=i;j*=5)
    {
       p=p+i/j;  // step 2
    }
    
    步骤3
    |第一步
    V V
    
    对于(j=5;j如果您了解他们用于查找中和中概述的阶乘的尾随零的数量的方法,则此算法更有意义。基本上取决于您需要考虑阶乘展开中
    5
    2
    的所有乘积以发现将有多少个零最后,我很高兴

    查找
    x!
    中尾随零数的算法归结为:

  • 查找
    5的连续幂
  • x
    除以结果,将截断的结果添加到总数中
  • 当除法结果小于
    1
    时停止,或者在这种特定情况下,我们知道当结果大于
    x

  • 因此,如果回到代码,我们可以找到以下步骤:

             step 3
             |    step 1
             V    V
    for (j=5;j<=i;j*=5)
    {
       p=p+i/j;  // step 2
    }
    
    步骤3
    |第一步
    V V
    
    对于(j=5;j@lundin我很好奇为什么要回滚?通常不鼓励使用和。另一种编辑是为了澄清是哪一种改进了帖子。@ShafikYaghmour您编辑了标题,使其毫无意义,然后添加了自己的文本。这两种编辑都是无效的。另外,编辑只是为了删除标题中的标记是一个小改动,不会改变大幅改进帖子,就像编辑删除“谢谢”一样。“谢谢”不是一种问候语。礼貌并没有错,因此不会阻止它(与不鼓励添加签名相反)@Lundin我确实在标题中删掉了太多的内容,这是一个错误,但从阅读问题中不清楚代码的目标是什么,这很重要。如果以后链接不再有效,那么这个问题就没有多大意义。我添加的元帖子似乎包含了所有的称呼,没有区别,但我没有做扩展e搜索。@ShafikYaghmour不过,你不应该在其他人的帖子中添加你自己的文字。改为发表评论,和/或推动海报以包含更多信息。无论如何,我不会因为一些小的编辑而进行回滚战。如果你不同意我的观点,请引起diamond mod的注意,他们可以解决。故事结束。@lundin我是curiou这就是为什么要回滚?通常不鼓励使用和。另一种编辑是为了澄清是哪一种改进了帖子。@ShafikYaghmour您编辑了标题,使其毫无意义,然后添加了自己的文本。这两种编辑都是无效的。另外,编辑只是为了删除标题中的标记是一种小的更改,并不会显著改进文章的质量e post,就像编辑删除“谢谢”一样。“谢谢”不是一个问候语。礼貌并没有错,因此不会阻止它(与添加签名相反,不鼓励添加签名)@Lundin我确实在标题中删掉了太多的内容,这是一个错误,但从阅读问题中不清楚代码的目标是什么,这很重要。如果以后链接不再有效,那么这个问题就没有多大意义。我添加的元帖子似乎包含了所有的称呼,没有区别,但我没有做扩展e搜索。@ShafikYaghmour不过,你不应该在别人的帖子中添加你自己的文字。改为发表评论,和/或轻推海报以包含更多信息。无论如何,我不会因为一些小的编辑而进行回滚战。如果你不同意我的意见,请引起diamond mod的注意,他们可以解决。故事结束。阅读e解释我得到,我们需要找到5的倍数直到问题中的数字,但是,样本输入3的输出为14(如codechef网站所示)。请你解释一下它是如何计算的吗?@subasish我没有得到你的问题。这里