一、题目部分
题目描述
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。
注意:
加号与等号各自需要两根火柴棍
如果A≠B,则A+B=C与B+A=C视为不同的等式(A,B,C>=0)
n根火柴棍必须全部用上
输入格式
一个整数n(n<=24)。
输出格式
一个整数,能拼成的不同等式的数目。
输入输出样例
输入 #1
14
输出 #1
2
输入 #2
18
输出 #2
9
二、解题过程
思路
(1)先确定每个个位数对应的火柴数;
(2)确定A能拼的火柴数的最大值1111(除去加号和等号的火柴数,假设B已确定为最小值2根:1);
(3)对十位以上的数 循环 进行相应的火柴数赋值(用数组存储);
(4)从0开始二层循环 对A、B进行相应的赋值;
(5)比较A+B数值对应的火柴数的相加结果是否等于C减去A&B&加号&等号相加的结果;
(6)若相等,则成立等式数目+1。
提交AC答案
#include<bits/stdc++.h>
using namespace std;
const int single[10]={6,2,5,5,4,5,6,3,7,6};//个位数对应的火柴数(定值)
int change[2223]={6,2,5,5,4,5,6,3,7,6};//进行循环赋值的可变数组
int n,ans;//一个整数和对应的不等式的数目
int key,c;//key存放(A+B)对应的火柴数,c存放剩下的火柴数
int equal(int num)
{
int m,t=0;//t记得初始化
while(num>0)
{
m=num%10;
num=num/10;
t+=single[m];
}
return t;
}
int main()
{
//对十位以上(包括十位)的数进行循环赋值
for(int i=10;i<2223;i++)
{
change[i]=equal(i);
}
scanf("%d",&n);
//循环赋值&比较
for(int i=0;i<1111;i++)
{
for(int j=0;j<1111;j++)
{
key=change[i+j];
c=n-4-(change[i]+change[j]);
if(key==c)
ans++;
}
}
//验证
//printf("%d",change[11]);
printf("%d",ans);
return 0;
}
三、小结
(1)注意每次循环赋值时初始化的问题;
(2)在用数组存储A+B之和对应的火柴数时注意扩大数组的范围;
(3)可以尝试用回溯法进行解题,记得理解和复习回溯算法。