C语言使用modulo取模运算时触发SIGFPE算术异常问题求助
错误原因
- 核心问题是取模运算的下标使用错误
你代码中int temp = j % newArr[j][2];里的j是遍历区间[start, end]的数值,不是当前测试用例的索引。你当前处理的是第i组测试用例,作为除数的K应该取newArr[i][2],而非newArr[j][2]。j的取值很容易超过newArr的最大有效下标99,触发数组越界访问,读到的随机内存值如果为0,C语言中对0做取模运算会直接触发SIGFPE算术异常。而JS中对0取模只会返回NaN不会导致程序崩溃,所以相同逻辑在JS中可以运行,在C中直接报错。 - 次要问题:你定义
arr数组时末尾的301n]不符合C语言语法规则,同时你写死循环处理100个测试用例,没有读取arr[0]存储的实际测试用例数量,也会带来潜在的越界风险。
修复方法
首先修正取模行的下标即可解决崩溃问题:
// 把错误的newArr[j][2]改为newArr[i][2] int temp = j % newArr[i][2];
如果要优化性能,不需要遍历区间内的所有数字,可以直接用数学公式计算结果,时间复杂度从O(n)降到O(1):
int K = newArr[i][2]; if (K == 0) { // 处理K为0的非法输入情况 result = 0; } else { result = end / K - (start - 1) / K; }
你可以直接用这段代码替换原来的j循环部分,运行效率更高。
内容的提问来源于stack exchange,提问作者Muhammad Rifqi
相关产品推荐
相关产品推荐

