火柴棒等式


给出 n 根火柴棒,可以拼出多少个形如 a + b = c 的等式。

等式中的 a,b,c 是用火柴棒拼出的整数(不能有前导零),数字和符号使用的火柴棒数量如下:

1
2
3
4
5
6
7
8
9
10
11
12
0:6
1:2
2:5
3:5
4:4
5:5
6:6
7:3
8:7
9:6
+:2
=:2

有以下注意事项:

  1. 加号和等号各自需要两根火柴棒
  2. 如果 a ≠ b,则 a + b = c 和 b + a = c 视为不同的等式,a,b,c 均不小于 0
  3. n 根火柴棒必须全部用上。

输入

共一行一个整数 n。(1 ≤ n ≤ 24)

输出

输出能组成的等式数。

样例

1
14
1
2

样例说明:两个等式如下

1
2
0 + 1 = 1
1 + 0 = 1

参考代码

难点:枚举范围的确定,取火柴消耗数量最少的数字1举例(使得相加数值最大,由此确定最大范围),最大为1111+1111=2222。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
using namespace std;

int n;//火柴数量
int ans;
int num[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};

int func(int x) {
int count = 0;
if (x == 0) return 6;
while (x) {
count += num[x % 10];
x /= 10;
}
return count;
}

int main() {
cin >> n;
for (int i = 0; i <= 2000; ++i) {
for (int j = 0; j <= 2000; ++j) {
if ((func(i) + func(j) + func(i + j) + 4) == n) {
ans++;
cout << i << " + " << j << " = " << i + j << endl;
}
}
}
cout << ans << endl;
return 0;
}