乘式还原
题目
A代表数字0到9中的前五个数字,Z代表后五个数字,请还原下列乘式。
AZA
*AAZ
----------
AAAA
AAZZ
ZAA
----------
ZAZAA
输出格式要求:
" %d\n"
"* %d%d\n"
"........................\n"
" %d\n"
" %d\n"
"........................\n"
" %d\n"
程序运行示例如下:
372
*246
----------
2232
1488
744
----------
91512
暴力解法思路
- 首先,穷举了这两个三位数的所有可能性:通过观察可以得到进行相乘的是两个三位数,也就是六个数字,使用六个嵌套循环,每个循环穷举一个位的所有可能性(如果是A就是04,如果是Z就是59)。
- 再者,判断乘式中间部分的每个表达式是否满足A在04且Z在59:将第一个三位数分别与第二个三位数的个位、十位、百位相乘,得到三个值,分离这三个值的每一位,并将每一位对照乘式判断是否满足条件。
- 最后,判断乘式末尾部分表达式是否满足A在04且Z在59:将第二步算出的三个值相加得到一个新的值,分离这个新值的每一位,判断新值的每一位是否满足条件。
程序代码(C语言)
#include <stdio.h>
int main(void)
{
int A, B, C, D, E, F, fi, se, th, fi1, fi2, fi3, fi4, se1, se2, se3, se4, th1, th2, th3, sum = 0, sum1, sum2, sum3, sum4, sum5;
for(A = 1; A <= 4; A++)
for(B = 5; B <= 9; B++)
for(C = 0; C <= 4; C++)
for(D = 1; D <= 4; D++)
for(E = 0; E <= 4; E++)
for(F = 5; F <= 9; F++)
{
fi = (A * 100 + B * 10 + C) * F;
se = (A * 100 + B * 10 + C) * E;
th = (A * 100 + B * 10 + C) * D;
fi1 = fi / 1000;
fi2 = fi / 100 % 10;
fi3 = fi / 10 % 10;
fi4 = fi % 10;
se1 = se / 1000;
se2 = se / 100 % 10;
se3 = se / 10 % 10;
se4 = se % 10;
th1 = th / 100;
th2 = th / 10 % 10;
th3 = th % 10;
if(fi1 >= 1 && fi1 <= 4 && fi2 <= 4 && fi3 <= 4 && fi4 <= 4)
{
if(se1 >= 1 && se1 <= 4 && se2 <= 4 && se3 >= 5 && se4 >= 5)
{
if(th1 >= 5 && th2 <= 4 && th3 <= 4)
{
sum = (A * 100 + B * 10 + C) * (D * 100 + E * 10 + F);
sum1 = sum / 10000;
sum2 = sum / 1000 % 10;
sum3 = sum / 100 % 10;
sum4 = sum / 10 % 10;
sum5 = sum % 10;
if(sum1 >= 5 && sum2 <= 4 && sum3 >= 5 && sum4 <= 4 && sum5 <= 4)
{
printf(" %d%d%d\n", A, B, C);
printf(" *%d%d%d\n", D, E, F);
printf("----------\n");
printf(" %d%d%d%d\n", fi1, fi2, fi3, fi4);
printf(" %d%d%d%d \n", se1, se2, se3, se4);
printf(" %d%d%d \n", th1, th2, th3);
printf("----------\n");
printf("%d%d%d%d%d\n", sum1, sum2, sum3, sum4, sum5);
printf("");
}
}
}
}
}
}