如何修改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; }
关键修改点
- 添加
found标志变量,避免循环中重复输出 - 找到解后立即跳出循环,减少不必要的计算
- 数学优化版本通过公式变形将双重循环简化为单循环,效率提升明显
内容的提问来源于stack exchange,提问作者Manik
相关产品推荐
相关产品推荐

