0
#include<stdio.h>

int main()
{
    long ctr[100000],i;
    float j;
    long d[100000],T,h,o;

    scanf("%ld",T);
    printf("\n");

    for(i=0; i<T; i++)
    {
        scanf("%ld",d[i]);
        printf("\n");

        for(h=d[i]; h<=0; h--)
        {
            j=h%10;
            if(j==5)
            {
                ctr[i]++;
            }
        }
    }
    for(o=0; o<=i; o++)
    {
        printf("%ld\n",o);
    }
    return 0;
}

这是一个程序,用于查找用户输入的一组“T”数字的阶乘的尾随零的数量。

我所做的是将每个数字除以 10 并测试数字是否为 5。然后我将数字减 1 直到它达到 0。每对 5*4 贡献一个尾随 0。

程序是否消耗太多内存或是否存在其他运行时错误?该程序出现运行时错误,有人可以帮忙吗?

4

3 回答 3

3

几点观察:

  • long[100000]假设是普通的 32 位,则需要 400,000 字节的堆栈,如果是 64位,则需要long800,000 字节。long您有两个这样的数组,这可能会使您的程序达到操作系统堆栈大小的限制。
  • scanf()函数需要指向存储它正在读取的值的位置的指针。你没有给它指针。正如保罗 R 在评论中所说。
  • 假设输入正数,循环for(h=d[i]; h<=0; h--)将永远不会运行它的主体。
于 2012-06-01T09:53:00.757 回答
0

循环是无限的。确保计数不会变为负数,否则您将遇到运行时错误。

于 2012-06-26T01:31:00.293 回答
0

嗯......这个循环看起来像循环无穷大。

for(h=d[i]; h<=0; h--)

因此给你一个运行时错误......因为计数变为负数,并且你的循环条件说继续直到值小于或等于零,但看起来你的值永远不会达到零。

对于 scanf 函数,不要忘记使用 & 符号。像这样:

scanf("%ld", &sampleVariable);

这就是您的运行时错误的解决方案。:)


而且也许您应该使用高精度变量,我认为您需要比双精度数据类型更高的精度,因为您将处理大量数字。

有关附加信息,请参见此处:http ://www.nongnu.org/hpalib/

于 2012-06-01T09:52:22.583 回答