火柴棍等式(暴力枚举)

Posted Aline2021-yxz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了火柴棍等式(暴力枚举)相关的知识,希望对你有一定的参考价值。

题目描述:给你n个火柴棍,判断能够构成多少个A+B=C(A,B,C为由0~9构成的正整数)形式的等式,其中+与=各由两个火柴棍构成,非零数字的最高位不为零,0 ~ 9的构成如下:

时间限制:1s
n<=24

例子:
n=18
输出: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。

题目分析:n个火柴棍,其中四个明确被使用,那只要通过不断对每个位置枚举,只要满足等式并且三个数的火柴棍总数等于n-4就满足要求。

明确大思路,我们还要解决一个问题,枚举的范围是多少?通过0~9的组成可以发现1使用的火柴棍是最少的为2,以24为例,(24-4)/2=10,所以24个火柴棒最多能构成10个1,那么对于一个等式来说,每个数字都应该小于5个1才有可能成立,任何一个数大于或等于11111都不可能使等式成立。

再看时间限制,要求在1s内,如果我们对等式的每个位置都枚举,那么n=24的时候我们需要枚举11111*11111**11111次,远超1s,我们可以通过只枚举等式的左边,算出等式的右边解决问题,这个问题也不是完完全全的暴力枚举,还是有注意的地方。

思路明确,上代码:

int Get_Num(int tmp)//获得组成这个数字的火柴棍数量

	int arr[] = 6,2,5,5,4,5,6,3,7,6;
	int num = 0;
	while (tmp/10)
	
		num += arr[tmp % 10];
		tmp /= 10;
	
	num += arr[tmp];

	return num;



int Number_Of_Equations(int n)

	int weights = (n-4) / 4;//最大数的次方
	int max_num=0;
	int count = 0;//记录等式个数
	int i = 0;
	while (i < weights)//获得最大数,也就是枚举上限
	
		max_num += pow(10, i);
		++i;
	
	for (int a = 0; a < max_num; a++)
	
		for (int b = 0; b < max_num; b++)
		
			if (Get_Num(a) + Get_Num(b)+Get_Num(a+b) == n - 4)
				count++;
		
	


	return count;

以上是关于火柴棍等式(暴力枚举)的主要内容,如果未能解决你的问题,请参考以下文章

火柴棍等式(暴力枚举)

火柴棍等式

P1149 火柴棒等式

luogu P1149 火柴棒等式

P1149 火柴棒等式

P1149 火柴棒等式