题目大意


ABBDE_ABCCC=BDBDE在这个式子中,每个字母可以用一个数字(0~9)替换,相同字母只能用同一数字替换,不同字母用不同数字替换。可以用“+”、“-”、“*”、“/”,填补中间的空白。

问有多少种方案,使得等式成立。字母只有“A”、“B”、“C”、“D”、“E”五种,式子中的三个数,每个都不超过8位。

思路


简单的枚举题,需要注意以下几种情况:

  • 除数不能为0。
  • 题目要求等式中的数不能有前导零。
  • 除法要考虑余数,即5/2=2.5而不是2。
  • 某个字母可能并没出现过,那么用五重循环枚举时便会出现重复计算,需要额外处理。

代码


#include<iostream>
#include<stdio.h>
using namespace std;
char a[9],b[9],c[9];
//a[]、b[]、c[]用于存储输入的字符串。 
int value[5];
//value[i]表示字母'A'+i对应的值。 
int get_value(char num[])
//计算字符串num[]所表示的值。 
{
	int value_num=0;
	for(int i=strlen(num)-1,j=1;i>=0;i--,j*=10)
		value_num+=value[num[i]-'A']*j;
	return value_num;
}
bool pre_zero(char num[])
//判断字符串num[]对应的数是否存在前导零。 
{
	if(strlen(num)>1&&value[num[0]-'A']==0)
		return true;
	return false;
}
int check()
//计算当前value[]下,符合式子的情况的个数。 
{
	if(pre_zero(a)||pre_zero(b)||pre_zero(c))
		return 0;
	int value_a=get_value(a),value_b=get_value(b),value_c=get_value(c),sum=0;
	if(value_a+value_b==value_c)
		sum++;
	if(value_a-value_b==value_c)
		sum++;
	if(value_a*value_b==value_c)
		sum++;
	if(value_b!=0&&value_a%value_b==0&&value_a/value_b==value_c)
		sum++;
	return sum;
}
int check_use(char x)
//判断字符x是否出现在3个字符串中。若出现过,返回1,否则返回0。 
{
	for(int i=strlen(a);i>=0;i--)
		if(a[i]==x)
			return 1;
	for(int i=strlen(b);i>=0;i--)
		if(b[i]==x)
			return 1;
	for(int i=strlen(c);i>=0;i--)
		if(c[i]==x)
			return 1;
	return 0;
}
int no_use()
//计算没用过的字母的个数。 
{
	int sum=0;
	for(int i=0;i<5;i++)
		sum+=check_use('A'+i);
	return 5-sum;
}
int solved()
//找出所有符合式子的情况的个数。 
{
	int sum=0;
	for(value[0]=0;value[0]<10;value[0]++)
		for(value[1]=0;value[1]<10;value[1]++)
			if(value[1]!=value[0])
				for(value[2]=0;value[2]<10;value[2]++)
					if(value[2]!=value[1]&&value[2]!=value[0])
						for(value[3]=0;value[3]<10;value[3]++)
							if(value[3]!=value[2]&&value[3]!=value[1]&&value[3] !=value[0])
								for(value[4]=0;value[4]<10;value[4]++)
									if(value[4]!=value[3]&&value[4]!=value[2]&& value[4]!=value[1]&&value[4]!=value[0])
										sum+=check();
	for(int i=no_use();i>=1;i--)
	//根据没用过字母的个数,派出重复的情况。 
		sum/=(i+5);
	return sum;
}
int main()
{
	int t;
	for(scanf("%d",&t);t>0;t--)
	{
		scanf("%s %s %s",a,b,c);
		printf("%d\n",solved());
	}
}