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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:06:03