题目描述
给你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根火柴棍必须全部用上
输入
输入共一行,只有一个整数n(n<=24)。
输出
输出共一行,表示能拼成的不同等式的数目。
输入样例复制
【输入输出样例1】 14 【输入输出样例2】 18
输出样例复制
【输入输出样例1】 2 【输入输出样例2】 9
说明
【输入输出样例1解释】
2个等式为0+1=1和1+0=1。
【输入输出样例2解释】
9个等式为:
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
红色字是重点哦!
思路讲解
这道题目简单来讲还是很简单的,将可能出现的数字的所需数量得出
并进行遍历,即为正解!
代码解说
首先需要进行定义每一位各位数火柴棒所需的数量:
int number[]={6,2,5,5,4,5,6,3,7,6};
因为这个的循环次数不确定,所以最好给出一个确定的常量
const int N=200;
插入一个小知识点:宏定义
什么是宏定义?
就是用一个你想用的字符串来代替已知的字符串!
具体用法:
#define 你想要的字符串 你想要替换的字符串
例如:
#define _for(a,c,b) for(int a=c;a<=b;a++)
那么便将 _for(a,c,b) 转换为了 for(int a=c;a<=b;a++)
例如 _for(i,1,100) 那实际意义就是 for(int i=1;i<=100;i++)
另外:
宏定义纯粹是替换,例如 #define N 12+4
那么cout<<N*2;
得出的数是12+4*2而不是(12+4)*2
要想达到(12+4)*2
那么就可以将#define N 12+4更改为#define N (12+4)
好了我们回到正题
int ws_pd(int n,int k)//位数判定
{
long long t,s;
t=pow(10,k);
s=n%t;
if(n==s)
return k;
else
ws_pd(n,k+1);
}
#define ws(a) ws_pd(a,1)
先写一个函数进行位数判定,其实是为截取每一位数做准备
截取每一位数
int jq(int n,int f)
{
memset(a,0);y=z=0;
int k=n,s=0;
while(k!=0)
{
s++;
k/=10;
}
y=s-1;
for(int i=1;i<=s;i++)
{
z++;
k=n;
a[z]=k/pow(10,y);
a[z]%=10;
y--;
}
return a[f];
}
这个函数实际上是截取 n 的第 f位主函数
{
cin>>n;
_for(i,0,N)
{
_for(j,1,ws(i))
atake[dmax]+=number[jq(i,j)];//将每一位数截取出来并将对应的值赋值到atake中,例如12的火柴棒值在这里面就是2+5=7
dmax++;//下一个数
}
_for(i,0,N)_for(j,0,N)_for(p,0,N)
{
if(atake[i]+atake[j]+atake[p]+4==n&&i+j==p)
//atake[i]+atake[j]+atake[p]+4==n 这句话的意思是三个数加上运算符的火柴棒数量等于总量
//i+j==p这句话是前两个数的值相加等于第三个数
emax++;//如果满足,满足的等式加一个
}
cout<<emax;//输出满足条件的等式
return 0;
}
tips:这个答案只能获取部分分数!
#include<bits/stdc++.h>
using namespace std;
int num[11]={6,2,5,5,4,5,6,3,7,6};
int s(int x)
{
if(x==0)
return num[0];
int ans=0;
while(x!=0)
{
int t=x%10;
ans+=num[t];
x/=10;
}
return ans;
}
int main()
{
int n,sum=0;
cin>>n;
for(int i=0;i<=1000;++i)
{
for(int j=0;j<=1000;++j)
{
if(s(i)+s(j)+s(i+j)+4==n)
sum++;
}
}
cout<<sum;
return 0;
}