【问题标题】:Why am I getting SIGFPE here?为什么我在这里得到 SIGFPE?
【发布时间】:2021-11-08 02:00:44
【问题描述】:

我已确保在声明 i%a[i] == 0 中,ia[i] 介于 1 和 100 之间。但是,我仍然收到此错误消息!

#include <stdio.h>

int main()
{
    int n, m, x = 0, count = 0;
    scanf("%d %d", &n, &m);

    int a[n], b[m];

    for(int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

    for(int i = 0; i < m; i++)
    {
        scanf("%d", &b[i]);
    }

    for(int i = 1; i <= 100; i++)
    {
        if(i % a[i] == 0)
        {
            x++;
        }
        else if(b[i] % i == 0)
        {
            x++;
        }

        if(x == 2)
        {
            count++;
        }
        else
        {
            continue;
        }
        x = 0;
    }

    printf("%d", count);

    return 0;
}

错误信息:

Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x0000000000401113 in main () at Solution.c:23
23                  if(i%a[i]==0){

【问题讨论】:

  • 你在哪里确定a[i] 是非零的?为什么你从一个地方从 0 开始计数,而在另一个地方从 1 开始计数?为什么你的最后一个循环达到 100 而不是 n 和/或 m
  • 当 a[i] 或 b[i] 等于 0 时,你将不得不做一些不同的事情。
  • 编辑问题以提供minimal reproducible example,包括重现问题的示例输入。
  • @interjay 它是问题陈述中给出的约束
  • 问题陈述提供了以下约束:1

标签: c loops for-loop variable-length-array


【解决方案1】:

在这个 for 循环中使用幻数 100

for(int i = 1; i <= 100; i++)

只有在nm 不小于101 的情况下才有意义。

注意程序不保证a[i]不等于0

【讨论】:

  • hackerrank.com/challenges/between-two-sets/problem 请参考这个问题陈述。对输入值有明确的限制,并且没有提到 a[i] 小于 1。
  • @YuvrajSakshith 那里写什么并不重要。我说你的程序不保证这个要求。用户可以输入任何数字。
  • 输入是网站生成的就是我说的。如果已经设置了此类约束,则不存在除以零的问题。
【解决方案2】:

来自莫斯科的 Vlad 正确地指出 该程序不保证 a[i] 不等于 0 但他没有向你明确说明你问的问题不是a[i] 的“用户可以输入任何数字” - 问题在于根本没有输入的 a[i] 数字。 输入由网站生成,仅定义了从 0 到 n−1 的 a[i] for i,而您的循环尝试访问从 1 到 100 的 a[i] for i ;未定义的a[i] 可以为 0;当 a[i] 为 0 时,ia[i] 得到 Arithmetic exception

因此,请注意莫斯科的警告中的 Vlad,并更改您的程序,使其不会尝试使用未定义的值。

有什么办法可以解决这个问题吗?还是另一种方法?

如果您只在数组a[]b[] 中使用有效索引,则基本上可以保留您的方法;你的主循环体可能是:

    {   x = 0;
        // use only valid indexes for a[] and b[]
        for (int j = 0; j < n; ++j) if (i % a[j] == 0) ++x;
        for (int j = 0; j < m; ++j) if (b[j] % i == 0) ++x;
        if (x == n+m) ++count;
    }

【讨论】:

  • 嗯,有什么办法可以解决这个问题吗?还是另一种方法?
  • 我扩展了答案。
猜你喜欢
  • 2020-07-31
  • 2016-11-22
  • 2015-10-25
  • 1970-01-01
  • 2016-09-26
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多