题目:
描述给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:
注意:
1. 加号与等号各自需要两根火柴棍
2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C≥0)
3. n根火柴棍必须全部用上
分析:
要找出形A+B=C的等式,最简单的办法就是分别枚举A、B、C,
然后确定A、B、C的枚举范围,经分析范围为0-1111,因为题目
中最多只有24根火柴,除去“+”“=”占用的4根火柴,最多剩下20根
火柴。20根火柴最多能组成10个1,因此A、B、C任意一个数不能
超为1111。
是否需要三重循环呢?可以简化成两重循环,降低时间复杂度,
提高算法效率。通过枚举A,B,求出C,算法得以优化
然后确定A、B、C的枚举范围,经分析范围为0-1111,因为题目
中最多只有24根火柴,除去“+”“=”占用的4根火柴,最多剩下20根
火柴。20根火柴最多能组成10个1,因此A、B、C任意一个数不能
超为1111。
是否需要三重循环呢?可以简化成两重循环,降低时间复杂度,
提高算法效率。通过枚举A,B,求出C,算法得以优化
代码:
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int fun(int x)
{
int num=0;//用来计数的变量,一定要初始化
int f[10]={6,2,5,5,4,5,6,3,7,6};//用一维数组来记录0-9每个数安需要用多少根火柴棍
while(x/10!=0)//如果x/10的商不等于0,说明这个数至少有两位
{//获得X的末尾数它将将此数所需要用到的火柴棍根数累加到num中
num+=f[x%10];
x=x/10;
}
//最后加上此时x所需用到的火柴棍的根数(此时x一定是一位数)
num+=f[x] ;
return num;//返回需要火柴根的总根数
}
int main()
{int a,b,c,m,sum=0;
cin>>m;//读入火柴棍的个数
//开始枚举a和b
for(a=0;a<=1111;a++)
{for(b=0;b<=1111;b++)
{c=a+b;
if(fun(a)+fun(b)+fun(c)==m-4)
{printf("%d+%d=%d\n",a,b,c);//格式化输出
sum++; //记录总方案数
}
}
}
cout<<"一共可以拼出的方案数为:"<<sum<<endl;
return 0;
}