C语言查找二维数组和为指定值的元素对出现重复输出问题
重复输出的原因
- 循环逻辑错误:查找两个元素的和仅需要两层循环分别定位两个元素即可,你当前使用四层完全多余的循环,同一个符合条件的元素对会被外层循环反复匹配、多次输出。
- 二维数组越界访问:你定义的
num是3行4列的二维数组,第一维合法下标为02,第二维合法下标为03,但代码中value、value1的循环上限设为12,会大量读取数组外的内存垃圾值,同时同一个数组内的有效元素会被错误的下标组合多次访问,进一步加重重复输出问题。 - 去重逻辑失效:你本意想通过
value3 = value2 + 1避免元素对重复计算,但由于外层两层多余循环的存在,该限制完全无法生效,同一个元素对组合会被反复输出。
修复方案
可以先将二维数组按C语言行优先的存储规则,摊平为一维逻辑遍历,保证每个元素对仅判断一次,避免重复和越界问题,修改后代码如下:
#include <stdlib.h> #include <stdio.h> int main() { int num[3][4] = {5, -1, 17, 8, 4, 18, -3, 15, 26, 6, -6, 10}; // 将二维数组指针转为int类型一维指针,方便按顺序访问12个元素 int *p = (int*)num; int checker, val; printf("Enter integer to check: "); scanf("%d", &checker); printf("The pair of integers that add to %d are\n", checker); // 两层循环即可,外层取第i个元素,内层取i之后的第j个元素,保证每个对仅判断一次 for (int i = 0; i < 11; i++) { for (int j = i + 1; j < 12; j++) { val = p[i] + p[j]; if (val == checker) { printf("[%d,%d],", p[i], p[j]); } } } return 0; }
内容的提问来源于stack exchange,提问作者clownzxy
相关产品推荐
相关产品推荐

