题目链接:
本题比较重要的点在于判断加数的范围,即枚举的范围大小。由于题目已知 \(n \leqslant 24\),且用数字 \(1\) 拼成的数尽可能大。由于 \(1111+1=1112\) 已经用了 \(25\) 根小棒,已经超过了题目 \(24\) 根小棒的数据范围,所以上界为 \(1111\)。
#include <cstdio>
int a[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int cnt;
int f(int x) {//f函数用于计算一个数需要的火柴棒根数。
if (x == 0) return a[0];
int ans = 0;
while (x) {
int b = x % 10;
ans += a[b];
x /= 10;
}
return ans;
}
int main()
{
int n;
scanf("%d", &n);
n -= 4;//减去加号和等号
for (int i = 0; i <= 1111; i++) {
for (int j = 0; j <= 1111; j++) {
int k = i + j;//这里直接计算出k的值,可以优化掉一重循环
if (f(i) + f(j) + f(k) == n) cnt++;
}
}
printf("%d", cnt);
}
标签:10,题目,int,火柴,NOIP2008,等式,ans,P1149
From: https://www.cnblogs.com/pangyou3s/p/18105695