0

我遇到了运行时错误,请帮助解决问题。会不会是全球计数声明的二重奏?

http://ideone.com/6PMlrY

#include <stdio.h>

int count=0;

long long fact(long long num)
{
if(num==0)
return 1;
else
return (num*fact(num-1));
}

long long fzro(int abc)
{
    if(abc%10 == 0)
        {
            count++;
            fzro(abc/10);
        }
    return count;
}



int main(void) 
{
int lst,i;
unsigned long long ar[100000];
scanf("%lld",&lst);
for(i=0;i<lst;i++)
    {
    scanf("%lld", &ar[i]);
    printf("%lld \n", fzro(fact(ar[i])));
    }
}

问题集链接: http ://www.spoj.com/problems/FCTRL/

4

1 回答 1

1

您不需要计算阶乘,然后尝试找到它的尾随零。您收到运行时错误的原因是您正在尝试计算非常大的数字的阶乘值。例如100!将有 600 位数字,太大而无法处理导致 RE。相反,您需要继续将数字除以 5,并在每个中间步骤添加您在将 n 除以 5 时获得的商的值。在添加总和时获得的最终值将是您的答案。

int ret = 0;
while ( N )
{
ret += N / 5;
N /= 5;
} 

ret 的值是尾随零的数量。使用上述想法尝试获得交流电 :)

于 2013-10-03T13:34:14.537 回答