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

C++数组最值间元素乘积计算输出恒为1问题修复求助

问题修复与优化方案

乘积输出1的核心原因

你代码中的逻辑存在两处关键错误:

  • 你定义的min、max变量存储的是数组元素的数值,但后续乘积循环直接把这两个值当成数组下标使用,绝大多数场景下max+1 < min的条件永远不成立,循环一次都不会执行,乘积就保留了初始值1。
  • 就算你拿到了最大/最小值的下标,也没有判断两者在数组中的先后顺序,不能直接从大的下标往小的下标遍历。

另外你现在的负数求和逻辑也存在错误:循环条件设置为lpi_arr[i] < 0 && i < n,只要遍历到第一个非负数,循环就会直接终止,后面的负数不会被统计。

修复后的完整代码

#include <iostream>
#include <cstdlib>
#include <ctime>
// 引入算法库用于后续min/max比较下标
#include <algorithm>
using namespace std;

int main()
{
    int n, a, b, Prod = 1, Sum = 0;
    cout << "Initialize an array n: ";
    cin >> n;
    do
    {
        cout << "Input the start value: ";
        cin >> a;
        cout << "Input the end value: ";
        cin >> b;
        if (!(a < b))
        {
            cout << "a is bigger than b, please enter new values " << endl;
            continue;
        }
    } while (!(a < b));

    int* lpi_arr = new int[n];
    srand(time(NULL));
    cout << "Int numbers from " << a << " to " << b << endl;
    // 若需要随机数范围包含b,可改为rand() % (b - a +1) +a
    for (int i = 0; i < n; i++)
    {
        lpi_arr[i] = rand() % (b - a) + a;
        cout << lpi_arr[i] << " ";
    }

    // 同时保存最大最小值的数值和对应下标
    int max_val = lpi_arr[0], max_idx = 0;
    int min_val = lpi_arr[0], min_idx = 0;
    // 合并为一次遍历找最大最小值,减少遍历次数
    for (int i = 0; i < n; i++)
    {
        if (lpi_arr[i] > max_val)
        {
            max_val = lpi_arr[i];
            max_idx = i;
        }
        if (lpi_arr[i] < min_val)
        {
            min_val = lpi_arr[i];
            min_idx = i;
        }
    }

    cout << "\nmin element is = " << min_val << endl;
    cout << "max element is = " << max_val << endl;

    // 确定下标先后顺序,从左边界+1遍历到右边界-1
    int left_idx = min(max_idx, min_idx);
    int right_idx = max(max_idx, min_idx);
    for (int i = left_idx + 1; i < right_idx; i++)
        Prod *= lpi_arr[i];

    // 修复负数求和逻辑,遍历所有元素判断是否为负数
    for (int i = 0; i < n; i++)
    {
        if (lpi_arr[i] < 0)
            Sum += lpi_arr[i];
    }

    cout << "Summ =" << Sum << endl << "Prod = " << Prod << endl;

    delete[] lpi_arr; 
    return 0;
}

额外优化建议

  • 可以用C++标准库的std::vector代替手动new的数组,无需手动管理内存,避免内存泄漏风险
  • 替换老旧的rand()函数,使用C++11引入的<random>库生成随机数,分布更均匀、随机性更好
  • 移除using namespace std;,改用std::前缀调用标准库函数,避免命名冲突
  • 可以添加输入合法性校验,避免用户输入非整数导致程序逻辑异常

内容的提问来源于stack exchange,提问作者arcend

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:03