【发布时间】:2021-12-27 08:29:12
【问题描述】:
我正在尝试使用 C lang 编写一个程序来计算给定的两个数字 A 和 B,从 A 到 B 有多少个数字,包括在内,可以被另一个数字 K 整除。例如,如果 A 是 1, B 为 10,K 为 3,则有 3 个数满足:3、6、9。
当试图在在线编译器中调试它时,我得到了这个错误:
Program received signal SIGFPE, Arithmetic exception.
0x00005555555553fd in main () at main.c:346
346 int temp = j % newArr[j][2];
模数有什么问题吗?
这是我目前的尝试。我已经在js 中尝试过这个,它可以工作,但在C 中却不行
int main(void)
{
int arr[] = {100,16,9905,8,7346,...,301n]
//the input is array 0f 301 integers, which the
first element is just the number of test case
int newArr[100][3];
int no = 1;
int result = 0;
int x, y, i, j;
int start, end;
for (x = 0; x < 100; x++)
{
for (y = 0; y < 3; y++)
{
newArr[x][y] = arr[no];
no += 1;
}
}
for (i = 0; i < 100; i++)
{
if (newArr[i][0] < newArr[i][1])
{
start = newArr[i][0];
end = newArr[i][1];
}
else
{
start = newArr[i][1];
end = newArr[i][0];
}
for (j = start; j <= end; j++)
{
int temp = j % newArr[j][2];
if ( temp == 0)
{
result += 1;
}
printf(" %d result %d\n",i, result);
}
printf("case %d : %d \n", i, result);
result = 0;
}
return 0;
}
提前致谢!
【问题讨论】:
-
如果我正确阅读了代码,您会将
newArr[0][0]设置为值100。然后将其分配给end。然后使用for (j = start; j <= end; j++),它将使用值100作为newArr的索引。但是100超出了newArr的范围,导致未定义的行为。 -
继续前面的评论,
newArr[1][1]将被设置为值7346,这也是超出范围的。所以修复循环for (j = start; j <= end; j++)的条件是不够的,你还必须修复arr中的值。 -
@Someprogrammerdude
newArr[0][0]实际上设置为arr[1],因为我将no声明为1,抱歉代码不清楚。 -
好的,所以你跳过
arr[0]。然后将newArr[0][1]设置为值9905并将其用作newArr的索引。这仍然超出范围,非常超出范围。 -
我很抱歉,原来我唯一的错误是,在应该是
int temp = j % newArr[i][2];的int temp = j % newArr[j][2];中,我将“i”误认为“j”。因为我正在迭代newArr的第一个维度并且它有效。无论如何,我并没有真正赶上越界问题,(也许我们可以讨论更多)我只能假设这可能与您之前提到的newArr有关,而问题出现在newArr。感谢您的洞察力!