数据范围很小,暴力枚举即可.
一开始想复杂了,认为需要枚举出所有符合条件的数字,然后调整顺序,寻找等式 = =
事实上只需要枚举前两个数,然后判断是否符合条件即可.考虑24的情况,若B为1,则还剩下18根火柴.又A<C,所以A为1111.因而只要在[0,1111]内枚举A、B即可.复杂度不会算.
如果范围更大的话,可以令A<=B,枚举A、B.操作数大约是原来的一半.进一步的优化想不到了..
1
#include<stdio.h>
2
#include<iostream>
3
using namespace std;
4
int num[] =
{6, 2, 5, 5, 4, 5, 6, 3, 7, 6}, t[2230] =
{0};
5
int main()
{
6
int n, i, j, ans = 0;
7
scanf("%d", &n);
8
for (i = 0; i < 2230; i++)
{
9
int tmp = i;
10
t[i] += num[tmp%10];
11
while (tmp/10)
{
12
tmp /= 10;
13
t[i] += num[tmp%10];
14
}
15
}
16
for (i = 0; i < 1112; i++)
17
for (j =0; j < 1112; j++)
18
if (t[i]+t[j]+t[i+j]+4 == n) ans++;
19
printf("%d\n", ans);
20
}
21