[NOIP2008 提高组] 火柴棒等式
[NOIP2008 提高组] 火柴棒等式
题目描述
给你 \(n\) 根火柴棍,你可以拼出多少个形如 \(A+B=C\) 的等式?等式中的 \(A\)、\(B\)、\(C\) 是用火柴棍拼出的整数(若该数非零,则最高位不能是 \(0\))。用火柴棍拼数字 \(0\sim9\) 的拼法如图所示:
注意:
-
加号与等号各自需要两根火柴棍;
-
如果 \(A\neq B\),则 \(A+B=C\) 与 \(B+A=C\) 视为不同的等式(\(A,B,C\geq0\));
-
\(n\) 根火柴棍必须全部用上。
输入格式
一个整数 \(n(1 \leq n\leq 24)\)。
输出格式
一个整数,能拼成的不同等式的数目。
样例 #1
样例输入 #1
14
样例输出 #1
2
样例 #2
样例输入 #2
18
样例输出 #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\)。
Code
#include <bits/stdc++.h>
using namespace std;
int gs[10]={6,2,5,5,4,5,6,3,7,6};
int geshu(int n)
{
if(n==0) return 6;
int k=0;
for(int i=n;i!=0;i/=10)
{
k+=gs[i%10];
}
return k;
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int n;
cin >> n;
int num=0;
for(int a=0;a<=1000;a++)
{
for(int b=0;b<=1000;b++)
{
int c=a+b;
if(geshu(a)+geshu(b)+geshu(c)+4==n) num++;
}
}
cout << num;
return 0;
}
本文来自小默的博客,转载请注明原文链接:https://www.cnblogs.com/momotrace/p/p1149.html