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
相关产品推荐
相关产品推荐

