C++在线判题程序运行错误求助:数组元素倍数统计问题
问题分析与修复方案
先看你的代码:
#include <iostream> using namespace std; const int TMAX = 2000000; int num_chupiguays(const int a[], int n) { int suma = 0; int resul = 0; for (int i = 0; i < n; i++) { if (i > 0 && a[i] % suma == 0) { resul++; } // 在线判题系统报运行错误 /*if (i > 0 && suma != 0 && a[i] % suma == 0) { resul++; }*/ // 修改后报答案错误 suma += a[i]; } return resul; } void lee_vector(int a[], int& n) { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } } int main() { static int a[TMAX]; int n; do { lee_vector(a, n); if (n >= 0) { cout << num_chupiguays(a, n) << endl; } } while (n != -1); }
你的程序要统计数组中当前元素是前面所有元素之和的倍数的元素数量,现在遇到两个核心问题:
1. 初始版本运行错误的原因
第一个判断条件未处理suma == 0的情况,当前面所有元素之和为0时,执行a[i] % suma会触发除零异常,这就是在线判题系统报运行错误的直接原因。
2. 修改后答案错误的原因
你添加suma !=0的判断后,忽略了一种合法情况:当suma ==0且a[i] ==0时,数学上0是0的倍数(多数OJ的题目会认可这种定义),此时应该计入结果,但你的修改直接排除了该场景,导致漏统计。
另外还有一个隐藏问题:suma用int类型存在溢出风险。当数组元素数量接近2e6且元素值较大时,累加和会超过32位int的最大范围(约2e9),溢出后suma会变成负数或错误数值,导致后续取模判断完全失效,这也是答案错误的潜在诱因。
修复后的代码
#include <iostream> using namespace std; const int TMAX = 2000000; int num_chupiguays(const int a[], int n) { long long suma = 0; // 改用long long避免溢出 int resul = 0; for (int i = 0; i < n; i++) { if (i > 0) { if (suma == 0) { // 前面和为0时,仅当前元素为0才算符合条件 if (a[i] == 0) { resul++; } } else { // 前面和不为0时,判断取模是否为0 if (a[i] % suma == 0) { resul++; } } } suma += a[i]; } return resul; } void lee_vector(int a[], int& n) { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } } int main() { static int a[TMAX]; int n; do { lee_vector(a, n); if (n >= 0) { cout << num_chupiguays(a, n) << endl; } } while (n != -1); }
修复要点
- 将
suma的类型从int改为long long,彻底避免大数累加时的溢出问题。 - 分场景处理
suma ==0的情况:当前面元素和为0时,仅当前元素也为0才计数,符合数学定义和多数OJ的题目要求。 - 保留
i>0的判断,确保只从第二个元素开始检查(第一个元素没有前置元素)。
内容的提问来源于stack exchange,提问作者Ola
相关产品推荐
相关产品推荐

