给你n根火柴棍,你可以拼出多少个形如“A+B=CA+B=C”的等式?等式中的AA、BB、CC是用火柴棍拼出的整数(若该数非零,则最高位不能是00)。用火柴棍拼数字0-90−9的拼法如图所示:
注意:
加号与等号各自需要两根火柴棍
如果A!=B,则A+B=CA+B=C与B+A=CB+A=C视为不同的等式(A,B,C>=0A,B,C>=0)
n根火柴棍必须全部用上
输入格式
一个整数n(n<=24)。
输出格式
一个整数,能拼成的不同等式的数目。
输入输出样例
输入
14
输出
2
解题思路:我们可以想到,这个等式必然要有+号和=号,因此,火柴棒最大数目为24-4=20个。我们先把每个数字所需的火柴棒列出来存到数组里,然后开始枚举。因为1是所需火柴棒最少的数字,所以20根火柴棒最多可以枚举到1111,这样可以大大减少循环数。我们看代码。
#include <stdio.h>
#include <stdlib.h>
int fun(int x) //计算所需要的火柴数
{ int a[10]={6,2,5,5,4,5,6,3,7,6};
int i,sum=0;
if(x<10)
return a[x];
else
{ while(x>=10) //计算拼成多位数所需的火柴数
{ i=x%10;
sum=sum+a[i];
x/=10;
}
return sum+a[x];
}
}
int main()
{ int i,j,m,n,max=1;//i,j为循环变量
printf("请输入火柴数");
scanf("%d",&m);
n=((m-4)/2)/3+1; //最多需要几根火柴棒拼成1,因为1是里面所需最少的火柴数
for(i=1,j=1;i<n;j=j*10,i++)
max+=j*10; //将循环的最大范围求出来
for(i=0;i<max;i++)
{
for(j=0;j<max;j++)
{ if(fun(i)+fun(j)+fun(i+j)==m-4)
printf("%d+%d=%d\n",i,j,i+j);
}
}
return 0;
}