题目大意
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()); } }