You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组相邻元素求和异常排查:C++代码输出失控问题求助

问题分析与修复方案

看起来你的代码里有几个关键问题导致了输出异常,我们一步步来拆解:

1. 数组越界(直接引发奇怪输出的核心原因)

你的代码存在两处严重的数组越界访问:

  • 处理第一个元素(i == 0)时,你写了Bush[total],但数组索引范围是0到total-1,total明显超出边界,会读取内存中的随机垃圾值。
  • 当i == 0时,后续代码还会执行output = Bush[i] + Bush[i + 1] + Bush[i - 1];,这里i-1等于-1,同样是越界访问未知内存,这就是测试{1,2,3}时得到诡异数字7208681的根本原因。
  • 两个if判断没有用else分隔,当数组长度特殊时(比如total=1),会触发逻辑冲突。

2. 非标准的可变长度数组(VLA)

C++标准并不支持int Bush[total];这种运行时确定长度的数组,虽然部分编译器(如GCC)提供了扩展支持,但会导致代码可移植性问题,建议改用标准的std::vector存储动态长度数组。

3. 逻辑实现混乱

从代码里temp和output的赋值逻辑来看,你似乎想找出所有元素相邻和的最大值,但逻辑完全错误:循环中反复覆盖output的值,既没有正确计算每个元素的和,也没有正确维护最大值。


修复后的代码(找最大值版本)

根据你的需求(首尾循环计算相邻和,同时找出最大值),下面是符合标准且逻辑正确的代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int total;
    cin >> total;

    // 使用vector替代可变长度数组,符合C++标准
    vector<int> Bush(total);
    for (int i = 0; i < total; ++i) {
        cin >> Bush[i];
    }

    // 初始化最大值:先计算第一个元素的和
    int max_sum = Bush[0] + Bush[1] + Bush[total - 1];

    // 计算中间元素的和,并更新最大值
    for (int i = 1; i < total - 1; ++i) {
        int current_sum = Bush[i] + Bush[i-1] + Bush[i+1];
        if (current_sum > max_sum) {
            max_sum = current_sum;
        }
    }

    // 计算最后一个元素的和,并更新最大值
    int last_sum = Bush[total - 1] + Bush[total - 2] + Bush[0];
    if (last_sum > max_sum) {
        max_sum = last_sum;
    }

    cout << max_sum << endl;

    return 0;
}

代码说明

  • 用std::vector存储数组,避免了非标准特性的兼容性问题。
  • 分三部分处理元素,每个部分都正确维护了邻居索引:
    • 第一个元素的前邻居是数组最后一个元素Bush[total-1],后邻居是Bush[1]。
    • 最后一个元素的前邻居是Bush[total-2],后邻居是数组第一个元素Bush[0]。
    • 中间元素直接用i-1和i+1即可。
  • 正确维护最大值max_sum,每次计算当前元素的和后,与当前最大值比较并更新。

测试示例:

  • 数组{1,2,3}:每个元素的和都是6,输出6。
  • 数组{1,2,3,4}:第三个元素的和是9,所有元素的和分别为7、6、9、8,最大值为9,输出正确。

若需输出每个元素的和(而非最大值)

如果你的需求是打印每个元素的相邻和,可使用以下代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int total;
    cin >> total;

    vector<int> Bush(total);
    for (int i = 0; i < total; ++i) {
        cin >> Bush[i];
    }

    for (int i = 0; i < total; ++i) {
        // 三元运算符处理首尾元素的邻居
        int prev = (i == 0) ? Bush[total - 1] : Bush[i - 1];
        int next = (i == total - 1) ? Bush[0] : Bush[i + 1];
        int current_sum = Bush[i] + prev + next;
        cout << "第" << i+1 << "个元素的和:" << current_sum << endl;
    }

    return 0;
}

测试{1,2,3}时会输出三个6,测试{1,2,3,4}时会依次输出7、6、9、8,完全符合需求。

内容的提问来源于stack exchange,提问作者Пламен Цанев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:23:23