【问题标题】:FCTRL - Spoj, SIGSEGVFCTRL - Spoj,SIGSEGV
【发布时间】:2013-10-02 12:48:19
【问题描述】:

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

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/

【问题讨论】:

  • 您假设您有一个非常大的堆栈,可以容纳 100000 个多头,并在 fact() 函数中递归 1000000000 次。这是一个错误的假设。希望您读取的输入也不超过 100000 个数字。

标签: c


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多