关于ABCDE*4=EDCBA 问题

题目:
ABCDE*4=EDCBA
A、B、C、D、E 分别代表5个整数 且不重复

这是一道比较简单的编程
下面给出一个遍历的C语言解法:

#include

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)

你可能感兴趣的:(关于ABCDE*4=EDCBA 问题)