洛谷 P1149 [NOIP2008 提高组] 火柴棒等式
先看题目描述吧!
给你n根火柴棍,你可以拼出多少个形如A+B=C的等式?等式中的A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0∼9 的拼法如图所示:

输入格式:一个整数 。
输出格式:一个整数,能拼成的不同等式的数目。
给出的提示,很重要:
-
加号与等号各自需要两根火柴棍;
-
如果 A不等于,则 A+B=C与 B+A=C 视为不同的等式(A,B,C);
-
n根火柴棍必须全部用上。
这道题最重要的是把每个数用的火柴棒个数求出来,我的方法简单但复杂(其实不好)
for(int i=0;i<=10000;i++)//把每个数所用火柴棒数量算出来 ,就是把个、十、百…位的火柴棒数量相加 ,再存入
{
if(i<10)
{
b[i]=a[i];
}
if(i>9 and i<100)
{
b[i]=a[i/10]+a[i%10];
}
if(i>99 and i<1000)
{
b[i]=a[i/100]+a[i%100/10]+a[i%10];
}
if(i>999 and i<10000)
{
b[i]=a[i/1000]+a[i%1000/100]+a[i%100/10]+a[i%10];
}
}
没什么了,完整代码和注释:
#include<iostream>
using namespace std;
int a[15]={6,2,5,5,4,5,6,3,7,6};//存入0 —9所用火柴棒个数
int b[10000];
int main()
{
int n=0,x;//n是输出的答案,x是火柴棒的个数
cin>>x;
for(int i=0;i<=10000;i++)//把每个数所用火柴棒数量算出来 ,就是把个、十、百…位的火柴棒数量相加 ,再存入
{
if(i<10)
{
b[i]=a[i];
}
if(i>9 and i<100)
{
b[i]=a[i/10]+a[i%10];
}
if(i>99 and i<1000)
{
b[i]=a[i/100]+a[i%100/10]+a[i%10];
}
if(i>999 and i<10000)
{
b[i]=a[i/1000]+a[i%1000/100]+a[i%100/10]+a[i%10];
}
}
for(int i=0;i<=1000;i++)
{
for(int j=0;j<=1000;j++)
{
if(b[i]+b[j]+b[i+j]+4==x)//不能把=,+所用火柴棒忘掉
n++; //等式成立就加1
}
}
cout<<n;//直接输出,不用考虑有等式重复的情况
return 0;//养成好习惯
}
相信难不倒大家,看看就行,拜拜……
浙公网安备 33010602011771号