Minimize Number编程题C++代码运行出错,求错误原因及修正方案
Minimize Number 编程题错误排查与修复
错误原因
你的代码存在以下核心问题:
- 循环控制逻辑错误:当你完成一轮全元素除2操作后重置
x=0,但此时没有清空本轮的计数标记,后续遍历的逻辑边界混乱,导致多轮操作的计数被遗漏,比如200、200的测试用例,第三轮操作没有被统计到。 - 计数规则错误:你采用“单元素除2就+1,凑够N个就除以N”的计数方式,多次累加后会丢失计数,比如三轮操作的情况下,你的逻辑只能统计到2次。
- 终止判断错误:代码中只要当前遍历的元素是奇数就直接break,没有遵循「只要有任意一个元素是奇数,就终止所有操作」的规则,判断时机和判断逻辑都不符合题目要求。
另外补充一个更简单的解题思路:题目要求的操作次数,本质是数组中每个元素最多能被2整除的次数的最小值。比如某个元素最多能被2除k次就变成奇数,那么整个数组最多只能执行k次操作,之后该元素就不满足全偶的要求了。
修正后的代码
优化思路版本(效率更高)
#include <iostream> #include <climits> using namespace std; int main() { int n; cin >> n; int min_count = INT_MAX; for (int i = 0; i < n; ++i) { long long a; // 用long long避免1e9级别的数值计算溢出 cin >> a; int cnt = 0; while (a % 2 == 0) { cnt++; a /= 2; } if (cnt < min_count) { min_count = cnt; } } cout << min_count << endl; return 0; }
模拟操作版本(和你原有思路更接近)
#include <iostream> using namespace std; int main() { int num; cin >> num; int *arr = new int[num]; for (int x = 0; x < num; x++) { cin >> arr[x]; } int counter = 0; while (true) { // 先判断所有元素是否都是偶数 bool all_even = true; for (int i = 0; i < num; i++) { if (arr[i] % 2 != 0) { all_even = false; break; } } if (!all_even) break; // 全偶就全部除以2,计数+1 for (int i = 0; i < num; i++) { arr[i] /= 2; } counter++; } cout << counter << endl; delete[] arr; // 释放动态申请的内存避免泄漏 return 0; }
两个版本都可以通过所有测试用例,包括你提到的输入2 200 200会正确输出3。
内容的提问来源于stack exchange,提问作者golden_hacker
相关产品推荐
相关产品推荐

