洛谷 P1149 [NOIP2008 提高组] 火柴棒等式

先看题目描述吧!

给你n根火柴棍,你可以拼出多少个形如A+B=C的等式?等式中的A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0∼9 的拼法如图所示:

输入格式:一个整数

输出格式:一个整数,能拼成的不同等式的数目。

给出的提示,很重要:

  1. 加号与等号各自需要两根火柴棍;

  2. 如果 A不等于,则 A+B=C与 B+A=C 视为不同的等式(A,B,C);

  3. 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;//养成好习惯
}

相信难不倒大家,看看就行,拜拜……

posted @ 2023-03-12 00:34  没名可用  阅读(98)  评论(0)    收藏  举报