ABCDE * A = EEEEEE

ABCDE代表5个不同的数字,使得等式成立。

系统消息 若觉得内容不错,请点击左上角的"赞"图标,以优化网站的内容呈现。 另外,请及时验证注册邮箱,否则收不到21QA发出的红包。 官方Q群:250203055

asked 16 Jan '15, 16:46

%E8%B7%AF%E4%BA%BA%E7%94%B2's gravatar image

路人甲
131726860896


我现在只会使用程序求解~

方法一

# 把整数的各个位切割成一个序列
def bit_split(number):
    bit_seq = []
    while number >= 10:
        bit_seq.append(number % 10)
        number = number / 10

    bit_seq.append(number)

    return bit_seq

for number_of_bit in range(6,7):  # 为了扫描一个范围,不仅仅是题目给定的6
    for n in range(1,10):
        product = 0   # 积

        for pos in range(number_of_bit):
            product = product + n * 10 ** pos

        for multiplier in range(1,10):  # 乘数
            if product %  multiplier != 0:
                continue

            multiplicand = product / multiplier   # 被乘数

            # 检查最高位
            if multiplicand / (10 ** (number_of_bit - 2)) != multiplier:
                continue

            # 检查最低位
            if multiplicand % 10 != n:
                continue

            # 检查各位是否重复
            bit_seq = bit_split(multiplicand)
            if bit_seq.__len__() != set(bit_seq).__len__():
                continue

            print "%d * %d = %d" %(multiplicand, multiplier, product)

运算结果: 79365 * 7 = 555555

方法二

搞五个for循环暴力求解,这当然是可以的。但是时间复杂度大大提升。

我统计了一下,时间复杂度差了437倍。

系统消息 若觉得内容不错,请点击左上角的"赞"图标,以优化网站的内容呈现。 另外,请及时验证注册邮箱,否则收不到21QA发出的红包。 官方Q群:250203055
permanent link

answered 16 Jan '15, 16:53

%E5%8E%9F%E9%87%8E%E4%B9%8B%E7%8B%BC's gravatar image

原野之狼
1.9k9399116

编辑于 16 Jan '15, 17:35

虽然我的想法也是暴力循环求解,但我觉得可以逆向思维用除法(EEEEEE / A = ABCDE),只要两个for即可。

`#include <stdio.h>
#include <math.h>

#define product(y) (y100000+y10000+y1000+y100+y*10+y) `

int main()
{
unsigned char a,b,c,d,e;
long x;
for(e= 1;e<10;e++)
{
for(a = 1;a<10;a++)
{
if( (product(e)%a) !=0) continue;//必须确保能整除
x = product(e)/a;
if( (x/10000-a) !=0) continue;//最高位为A
if( (x%10-e) !=0) continue;//最低位为E
b = x%10000/1000;
c = x%1000/100;
d = x%100/10;
//互不相等
if((a != b)&&(a != c)&&(a != d)&&(a != e)&&(c != b)&&(d != b)&&(e != b)&&(c != d)&&(c != e)&&(d != e))
{
printf("a=%d b=%d c=%d d=%d e=%d",a,b,c,d,e);
break;
}
}
}
return 0;
}

系统消息 若觉得内容不错,请点击左上角的"赞"图标,以优化网站的内容呈现。 另外,请及时验证注册邮箱,否则收不到21QA发出的红包。 官方Q群:250203055
permanent link

answered 17 Jan '15, 13:20

lmx89's gravatar image

lmx89
263

编辑于 17 Jan '15, 13:36

我的想法是这样的: 从ABCDEA=EEEEEE, 我们可以得知AE的结果<100,且个位数是E,那我们可以假设A * E = 10 * X + E (X是个未知数且0<= X <=9)。做个转换得到(A-1) * E = 10 * X,从这个表达式我们可以得知A-1与E两者中有个是整数5,另一个则是个偶数。那么下面分情况来分析: (1) 当A-1=5, E为偶数时,即A=6,E为偶数 我们知道ABCDE * A=EEEEEE,结果是个六位数,而两个乘数分别是一位数和五位数。等式反过来也成立,即EEEEEE/A=ABCDE,列个除法表达式,我们可以推断A * A应该是最接近EE的数,我们已经知道A=6,那么A * A=36,最接近这个36的两位数且个位十位数是一样的就只有44了。于是EEEEEE=44444444,A=6,则ABCDE=44444444/6=74074,但是这个结果不满足我们的A、B、C、D、E分别是不同的数,所以这种情况不存立了。 (2)当E=5, A-1是偶数的情况 同(1)的理由,A * A最接近EE(55)的A应该是7了,则E=5,A=7,那么ABCDE=EEEEEE/A=555555/7=79365.这个结果满足我们的A、B、C、D、E分别是不同的数,所以A=7,B=9,C=3,D=6,E=5了。

系统消息 若觉得内容不错,请点击左上角的"赞"图标,以优化网站的内容呈现。 另外,请及时验证注册邮箱,否则收不到21QA发出的红包。 官方Q群:250203055
permanent link

answered 16 Jan '15, 19:22

elley's gravatar image

elley
11

编辑于 16 Jan '15, 19:28

lmx89同学的算法好像不对

系统消息 若觉得内容不错,请点击左上角的"赞"图标,以优化网站的内容呈现。 另外,请及时验证注册邮箱,否则收不到21QA发出的红包。 官方Q群:250203055
permanent link

answered 17 Jan '15, 15:49

redcar's gravatar image

redcar
1

哪里不对,你应该指出来!大家可以讨论下!

(18 Jan '15, 08:59) lmx89 lmx89's gravatar image
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link: [text](http://url.com/ "title")
  • image: ![alt](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×33
×4

question asked: 16 Jan '15, 16:46

question was seen: 3,843 times

last updated: 18 Jan '15, 09:02

powered by O*S*Q*A

粤ICP备14040061号-1