【问题标题】:Trailing zeroes of Factorial, Runtime error in C?C中的阶乘,运行时错误的尾随零?
【发布时间】:2012-06-06 13:13:17
【问题描述】:
#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。

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

【问题讨论】:

  • 您是否尝试在调试器下运行您的代码?你学到了什么 ?您还注意编译器警告吗?注意到scanf("%ld",T); 或scanf("%ld",d[i]); 有什么问题吗?
  • 你是说你除以零吗?这是个大问题!
  • 没有。其实是网上练习题。他们告诉我这是一个运行时错误。
  • 格式有很多不足之处。

标签: c


【解决方案1】:

循环无限。确保计数不会变为负数,否则会出现运行时错误。

【讨论】:

    【解决方案2】:

    嗯...这个循环看起来像是无限循环。

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

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

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

    scanf("%ld", &sampleVariable);
    

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


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

    更多信息请参见此处:http://www.nongnu.org/hpalib/

    【讨论】:

    • 假设问题是我发布的问题,输出是否正确?
    • :) 我刚刚回答了这个“这个程序出现运行时错误,谁能帮忙?”,这就是为什么,我只是帮助你解决了运行时错误。
    【解决方案3】:

    几个观察:

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

    【讨论】:

    • 如果您为 d[i] 输入负值,它可能会运行它的主体,:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多