下面程序的输出为( )。
#include <iostream>
using namespace std;
int main() {
int cnt = 0;
for (int x = 0; x <= 10; x++)
for (int y = 0; y <= 10; y++)
for (int z = 0; z <= 10; z++)
if (x + y + z == 15)
cnt++;
cout << cnt << endl;
return 0;
}模拟程序执行过程,逐行跟踪变量变化,特别关注循环边界和递归终止条件。
模拟执行时注意:① 循环变量的起始和终止值;② 递归的边界条件;③ 数据类型转换和精度问题。
【考点】枚举与组合计数|对称性分析|边界条件
考纲定位:GESP 八级“组合计数与枚举”模块,命题人卡住只会暴力枚举的考生。三重循环 11³=1331 次迭代,但答案要求精确计数,暴力可行却易忽略细节,这正是八级想考察的“在有限枚举中精准定位关键状态”的能力。八级不再满足于简单模拟,而是要求对状态空间有整体把握。
解题思维:利用对称性简化计算。x+y+z=15 且 0≤x,y,z≤10。先考虑无上限约束的非负整数解个数 = C(17,2)=136。再减去至少一个变量≥11 的情况:每个变量超限的解数 = C(4+2,2)=15,三个变量都可能超限且无重叠,故 136-3×15=91。若用容斥原理会更清晰:总解数 136,减去单个超限 3×15=45,加上双重超限 0(因为两个≥11 则和≥22>15),减去三重超限 0,得 91。对称性分析是处理多重循环计数的通用手法,任何类似的三重循环问题都可以先求全解再剔除越界。
陷阱拆解:选项 A(90) 是忘了重叠或减错;C(96) 误把上限当作≤9;D(100) 直觉猜测。最阴险的是边界条件:x,y,z 上限是 10,不是 9,很多人会下意识以为“不能超过 10"就是“最大 10",但枚举时容易误判,导致多算或少算。另外,三重循环中若写成 x<10 就少算一行,这是常见的 off-by-one 错误。若命题人把上限改成 9,答案会变成 96,这就是选项 C 的来源,说明 C 是