下面程序的输出为( )。
#include <iostream>
using namespace std;
int main() {
int cnt = 0;
for (int a = 1; a <= 10; a++)
for (int b = 1; b <= 10; b++)
for (int h = 1; h <= 10; h++)
if ((a + b) * h == 20)
cnt++;
cout << cnt << endl;
return 0;
}拿到三重循环别慌,核心就一句:(a+b)×h=20。先把20的因数拎出来,看h能取哪些值,再对每个h数有多少对(a,b)加起来等于20/h,最后累加就是答案。
最容易栽跟头的就是漏掉边界值。比如只盯着中间几个因数算,把h=1和h=10这种极端情况给忘了,或者把(a+b)的范围想窄了,以为a,b只能在1~5里凑,其实只要和够就行。还有人会把题目看花眼,把乘法条件当成加法条件去凑数,或者在数对的时候重复计数,比如把(a,b)和(b,a)当成两回事,其实循环里a、b都是独立遍历的,和相等的情况会自然被统计多次,这点要特别注意。
这道题落在GESP八级「算法与数据结构」模块,考的是最基础的暴力枚举能力。命题人卡住的是那些一看到三重循环就下意识想优化、想剪枝的考生——八级不考复杂算法,就考你能不能老老实实把题目条件翻译成代码跑一遍。
题目里有个条件 (a + b) * h == 20。别被乘法吓住,咱们把它拆开看:
a、b、h 都是从 1 到 10 的整数。h 最大只能到 10,所以 h 只能取 1、2、4、5、10 这五个值。h,剩下的部分 (a + b) 就必须等于 20 / h。也就是说,只要凑出和为某个数的两对 (a, b),就能让等式成立。