FCTRL - Spoj,SIGSEGV

时间:2013-10-02 12:48:19

标签: c

我收到运行时错误,请帮助纠正问题。它可能是全球计数的两个人吗?

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/

1 个答案:

答案 0 :(得分:1)

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

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

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