Online Compiler C

#include <stdio.h> #include <string.h> void print_min_sum_indices(int n, int a[]) { int sum = a[0] + a[1], sum_min = a[0] + a[1]; int i_min = 0, i_max = 1; for (int i = 0; i < n; i++) { for (int j = 1; j < n; j++) { if (i < j) { sum = a[i] + a[j]; if (sum < sum_min) { sum_min = sum; i_min = i; i_max = j; } } } } printf("%d %d", i_min, i_max); } int main() { int a[] = {1, 0, 20, 4, 5, -1, 33, -5}; print_min_sum_indices(8, a); return 0; }
这段代码的功能是:在数组中找出两个不同元素,使它们的和最小,然后输出这两个元素的索引。

代码使用了两层循环遍历所有可能的元素对,并记录当前找到的最小和对应的索引。但这里有一个逻辑上的小问题。

- 内层循环的 j 从 1 开始,这会导致当 i 为 0 时,j 从 1 开始没问题,但当 i 为 1 时,j 从 1 开始,会漏掉 j 为 0 的情况。虽然你用了 if (i < j) 来避免重复,但 j 的起始值应该为 0 才能覆盖所有 i < j 的组合。
- 另外,初始化 sum_min 时用了 a[0] + a[1],但数组可能为空或长度小于 2,不过这里数组长度是 8,所以暂时没问题。