火柴棍等式(暴力枚举)

题目描述:给你n个火柴棍,判断能够构成多少个A+B=C(A,B,C为由0~9构成的正整数)形式的等式,其中+与=各由两个火柴棍构成,非零数字的最高位不为零,0 ~ 9的构成如下:
火柴棍等式(暴力枚举)_第1张图片
时间限制: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;
}

你可能感兴趣的:(刷题中让我觉得好玩的,概率论,算法,leetcode)