这道题做麻烦了,我挨个算了1,2,3.....n根火柴能拼出来的所有的数,其实枚举数然后看需要多少火柴更简单。我的思路是逆向的,这就导致很费力。不过运行速度倒是蛮快。
大家当看个乐子吧
#include <stdio.h>
int b[20][400];
void cal(int a[])
{
int j, m, n;
for (int i = 0; i < 20; i++)
for (int j = 0; j < 400; j++)
b[i][j] = -1;
for (int i = 2; i <= 16; i++)
{
j = 0;
for (m = 0; m <= i; m++)
for (n = 0; n <= i; n++)
{
int q = i - m - n;
if (q <= 0)
break;
if (m == 0 && n == 0)
{
for (int k = 0; k < 10; k++)
if (a[k] == q)
b[i][j++] = k;
}
else if (m == 0 && n != 0)
{
for (int k = 1; k < 10; k++)
for (int s = 0; s < 10; s++)
if (a[k] == n && a[s] == q)
b[i][j++] = k * 10 + s;
}
else//三位数
{
for (int k = 1; k < 10; k++)
for (int s = 0; s < 10; s++)
for (int d = 0; d < 10; d++)
if (a[k] == m && a[s] == n && a[d] == q)
b[i][j++] = k * 100 + s * 10 + d;
}
}
}
}
int main()
{
int a[10] = { 6,2,5,5,4,5,6,3,7,6 };
int n, k, count = 0;
scanf("%d", &n);
n = n - 4;
cal(a);
for (int i = 2; i <= n - 4; i++)
for (int j = 2; j <= n - i - 2; j++)
{
k = n - i - j;
if (k < 0)
break;
for (int x = 0; b[i][x] >= 0; x++)
for (int y = 0; b[j][y] >= 0; y++)
for (int z = 0; b[k][z] >= 0; z++)
if (b[i][x] + b[j][y] == b[k][z])
count++;
}
printf("%d", count);
}