题目:
ABCDE*4=EDCBA
A、B、C、D、E 分别代表5个整数 且不重复
这是一道比较简单的编程题
下面给出一个遍历的C语言解法:
#include <stdio.h>
int calc ()
{
for (int i=10001; i<100000; i++)
{
int right = 0;
int left = i;
while ( left != 0 ) /*求右边的值*/
{
right = right * 10 + left % 10;
left /= 10;
}
if ( (i << 2) == right )
{
return i;
}
}
return -1;
}
void main(void)
{
printf("the result is : %d/n", calc());
}
但这种求法明显存在很多问题 为了获得更高的性能 我们完全可以先通过逻辑判断 去除掉一些明显无用的情况
以下是一些逻辑分析:
1.ABCDE这5个数多不能重复
2.ABCDE*4=EDCBA 很显然,A不是1,就是2,为0就不是五位数,如果大于2则乘积不会是五位数 因为4*E的个位数是A,则A只能是2
所以题目变成2BCDE*4=EDCB2
3.显然,E是8,原因是,乘以4个位为2的只有3,8,而根据高位2*4> =8,它只能为8
所以变成 2BCD8 * 4 = 8DCB2
4.注意到C那一位先后没有变化 所以 C其实只能是3 6 9 因为必须满足 C*4 以后的余数+前一位的进位还是C 很容易排除掉其他的数(例如:如果是7 则 7*4=28 进位2 余数8>7了 则不可能满足条件 )
5.既然BCD8*4没有进位,因此B只能是0,1
假设B=0,则CD8*4=DC02, 4*D的尾数必须为7,这肯定不可能
假设B=1,则1CD8*4 = DC12,4*D的个位数为8,D必然=7,因为1*4> 2,1C78*4=7C12 C*4=30+C-3, C=9,满足
所以等式必须为2588*4 或者2998*4,很显然都不满足
所以只能是(A,B,C,D,E)=(2,1,9,7,8)
实际上 通过分析 我们完全可以从C入手从第4步开始 来编程解决这个问题 B只能是0 1 C只能是3 6 9 情况就减少到 36种了 相比之前的 100000-10001种情况 要快不知道多少
对于上面的第5步 是其他网友的解法 在这里我有一种从C入手的逻辑判断方法
已知 2BCD8 * 4 = 8DCB2 C=3或6或9
当C=3时 3*4=12%10=2 即需要D进1位 进1位的话 即D*4+3是个1X的数字 即D能取 4、可是 B只能是0 1 所以 这种情况不行
当C=6时 6*4=24%10=4 即需要D进2位 即D*4+3是个2X的数字 D只能取5、 可是 B只能是0 1 这样不行
当C=9时 9*4=36%10=6 即需要进3位 即 D*4+3是个3X的数字 D只能取 6 7 9 可是 B只能是0 1 这样取D=7 即得到正确结果(A,b,C,D,E)=(2,1,9,7,8)