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

如何修改C++代码让每个测试用例仅输出一次YES/NO

问题解决:每个测试用例仅输出一次结果

问题分析

你当前的代码在双重循环的每次迭代中都会输出Yes或No,导致单个测试用例输出多行结果,不符合要求。需要调整为:用标志记录是否找到符合条件的a、b,循环结束后统一输出一次结果。

修改方案1:调整原双重循环逻辑

通过布尔变量标记是否找到解,找到后立即跳出所有循环,最后统一输出结果:

#include <iostream>
using namespace std;

int main() {
    int t, x, i, j;
    cin >> t;
    while (t--) {
        cin >> x;
        bool found = false;
        // 遍历可能的a值
        for (i = 1; i < x; ++i) {
            // 遍历可能的b值
            for (j = 1; j < x; ++j) {
                if (2*i + 2*j + i*j == x) {
                    found = true;
                    break; // 找到后跳出内层循环
                }
            }
            if (found) break; // 跳出外层循环,无需继续遍历
        }
        // 统一输出当前测试用例的结果
        cout << (found ? "Yes" : "No") << endl;
    }
    return 0;
}

修改方案2:数学优化(更高效)

对原式进行变形,简化判断逻辑:
原式 2a + 2b + ab = X 可推导为:

ab + 2a + 2b = X
ab + 2a + 2b + 4 = X + 4
(a+2)(b+2) = X + 4

由于a、b是正整数,a+2 ≥3、b+2 ≥3,因此问题转化为判断X+4能否分解为两个都≥3的正整数乘积。利用这个结论可以大幅减少计算量:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int t, x;
    cin >> t;
    while (t--) {
        cin >> x;
        int target = x + 4;
        bool found = false;
        // 检查3到sqrt(target)之间的因数
        for (int d = 3; d <= sqrt(target); ++d) {
            if (target % d == 0 && target / d >= 3) {
                found = true;
                break;
            }
        }
        cout << (found ? "Yes" : "No") << endl;
    }
    return 0;
}

关键修改点

  1. 添加found标志变量,避免循环中重复输出
  2. 找到解后立即跳出循环,减少不必要的计算
  3. 数学优化版本通过公式变形将双重循环简化为单循环,效率提升明显

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:09:26