喜欢 发表于 2014-8-28 04:11:13

独角兽 发表于 2014-8-27 02:52
0, 9, 18, 27, 36, 45, 54, 63, 72, 81

1) ABCD=9369: abcd=4321


独角兽喜欢gg,我这是很严格的,呵呵。。。

那你把你的推理过程写出来?就当给学生上课,要能把不懂的人教懂哦。

独角兽 发表于 2014-8-28 04:25:31

本帖最后由 独角兽 于 2014-8-28 05:14 编辑

独角兽 发表于 2014-8-27 15:52
0, 9, 18, 27, 36, 45, 54, 63, 72, 81

1) ABCD=9369: abcd=4321


喜欢gg喜欢我,我就接着写了。

最近电脑上爱坛少了,一般就是手机扫一眼,所以错过了好些帖子,日志什么的。评论和回复更是少了。昨晚才看见喜欢gg的这个帖子。看了题目,我确定一定以及肯定自己是一定会做的,可是写起来应该怪麻烦的,我就没算,然后就该干啥干啥去了。

可是,俺这一颗热爱趣味数学的真心呀,准备睡觉的时候突然又忍不住想把这题作出来。再后来觉得自己的算法还是有特别之处的,就忍不住写出来显摆了。

第一段:

俺觉得吧,这题的正道是逆向思维,也就是发现8889=10000-1111. 然后顺着这个思路下去,从后往前一位一位的推,把借位搞清楚了,就没问题了。同学们纷纷顺着这个思路给出了算法,有些表述的简洁一些,有些啰嗦一些,有些还有点儿小疏漏,但基本上都算是答出来了。

第二段:

给大家介绍一下独角兽的正向思维,邪派招术吧。

从8889到1111是此题的关键,但我当时第一感觉是8889会变成9999。9 为什么好呢?9乘以任何一个各位的数字尾数各不相同。是一一对应的关系。换句话说,任何一个ABCD我都能张口说出d的值来。正是因为想把8889变成9999,我一下困意全无,拿出纸笔就开练了。

我在解题的第一行给出了0到9与9的乘积就是想看看有没有人能够跟我想到同一个方向上去。

假如不考虑进位, abcd×8889
个位=9×d
十位=9×c+8×d
百位=9×b+8×c+8×d
千位=9×a+8×b+8×c+8d

这时候个位数乘9的另一个伟大的特性派上了用场,那就是乘积的十位数其实是比它本身小1. (注意0还是0)
这个数就是进位的。

考虑进位后:十位=9×c+8×d+(d-1)=9×(c+d)-1(这个1就是我前面计算过程提示中的+1),然后又可以用乘9的尾数定位出c+d的尾数了。

百位=9×b+8×c+8×d + (c+d-1)=9×(b+c+d)-1(到了这里停一下,如果上面(c+d)已经不是个位数字了,咋办?直觉告诉我,把10位再加上去就行了。于是,我用abcd=9999这个极限值验证了一下,果然如此。)

剩下的就是心算九九表和加减法了。5秒钟一个题没问题,但会出错,因为乘法的这个对应关系还是没有加法的直接。

算完了以后回帖,写答案之前心里没底,excel验算了一下,发现第10题居然错了。于是猜(+2)不是从20开始的,而是从19开始的。分别验算了18,19,20的情况,发现确实如此。猜测如果(+3)应该是从28开始,可惜只有(b+c+d)最大27,没法验算了。

以上,从9的乘法出发找出了这个所谓魔术的解法,心满意足的睡觉去了。。。{:189:}

独角兽 发表于 2014-8-28 05:09:02

独角兽 发表于 2014-8-28 04:25
喜欢gg习惯我,我就接着写了。

最近电脑上爱坛少了,一般就是手机扫一眼,所以错过了好些帖子,日志什么 ...

另外,我之所以第一反应会做,但懒得做,有一个原因是我前一段看了一本编程的书想拓展自己的思维方式。所以,我其实想用编程的方法做这个题。

int a=b=c=d=0, M=ABCD, N=8889

while (d*9)%10 != M%10
{
d++;
if d ==10
输出:搞错了,无解!换个数再试试?
end; //记不清是不是用end了,反正就是程序结束,收工了
}
while ((10*c+d)*89)%100 !=M%100
{
c++;
if c ==10
输出:搞错了,无解!换个数再试试?
end; //记不清是不是用end了,反正就是程序结束,收工了
}

while ((100*b+10*c+d)*889)%1000 !=M%1000
{
b++;
if b ==10
输出:搞错了,无解!换个数再试试?
end; //记不清是不是用end了,反正就是程序结束,收工了
}
while ((1000*a+100*b+10*c+d)*8889)%10000 != M

a++;
if a ==10
输出:搞错了,无解!换个数再试试?
end; //记不清是不是用end了,反正就是程序结束,收工了
}

最后输出 abcd=1000*a+100*b+10*c+d Oh yeah!

The end!

出错信息是后来想起来加上去的。具体编程的语言我记不太清楚,但思路是前两个月看编程书的收获。感觉自己很帅。哈哈。@holycow 神牛师傅来鉴定一下,这个程序编得够简洁吧{:189:}

黑洞的颜色 发表于 2014-8-28 05:57:00

喜欢 发表于 2014-8-27 05:03
可是您这算法的原理何在呢?能解释到俺(们?)能听懂的程度么?

看来脑袋瓜好使的人真不少啊!这么绕的 ...

抱歉,文笔不好,写算法用的时间比想出来的时间还长,也没说明白。好像匆忙中也没有贴全。

步骤为
0)        得到四位数MNOP=10000-ABCD
例如以上部分题目
1,ABCD=9369得 MNOP=0631
2,ABCD=2412得 MNOP=7588
3,ABCD=7889得 MNOP=2111
10,ABCD=5992得 MNOP=4008

1)        d=P:
1,ABCD=9369得 MNOP=0631; d=1;
2,ABCD=2412得 MNOP=7588; d=8;
3,ABCD=7889得 MNOP=2111; d=1;
10,ABCD=5992得 MNOP=4008;d=8;

2)        c=O-d, 如c小于0则加上10:
1,ABCD=9369得 MNOP=0631;d=1;c=3-1=2;
2,ABCD=2412得 MNOP=7588;d=8;c=8-8=0;
3,ABCD=7889得 MNOP=2111;d=1;c=1-1=0;
10,ABCD=5992得 MNOP=4008;d=8;c=0-8+10=2;

3)        b=N-n, 其中n 是c+d的各位数字之和。如b小于0则加上10:
   例如 c=7, d=8 则c+d=15,其各位数字之和 n=1+5=6; 如c=8,d=2, c+d=10, n=1
1,ABCD=9369得 MNOP=0631;d=1; c=2; n=3, b=6-3=3
2,ABCD=2412得 MNOP=7588;d=8; c=0; n=8, b=5-8+10=7
3,ABCD=7889得 MNOP=2111;d=1; c=0; n=1, b=1-1=0
10,ABCD=5992得 MNOP=4008;d=8;c=2;n=1,b=0-1+10=9
4)        a=M-m, 其中m 是b+c+d的各位数字之和。如a小于0则加上10:
1,ABCD=9369得 MNOP=0631;d=1; c=2; b=3; m=0-6+10=4, 最后 abcd=4321
2,ABCD=2412得 MNOP=7588;d=8; c=0; b=7; m=6,a=1,abcd=1708
3,ABCD=7889得 MNOP=2111;d=1; c=0; b=0; m=1,a=1,abcd=1001
10,ABCD=5992得 MNOP=4008;d=8;c=2;b=9, m=1, a=3, abcd=3928

注:d=8;c=2;b=9, 其各位数字之和要反复加到只剩一位: 8+2+9=19 =》10 =》1

上面36楼似乎有点typo.
6) ABCD=8059,应为abcd=2531.
7) ABCD=8002, abcd=2018

回头写原理

不爱吱声 发表于 2014-8-28 07:36:17

算法:
如果 D 等于 0:
    d = 0
    c = D-C
如果 D 不等于 0:
   d = 10-D
   c = D-C-1

如果 c 小于 0:
   b = C-B-1
   同时更新 c: c = c+10
如果 c 大于 0:
   b = C-B
   c 不变

如果b 小于 0:
   a = B-A-1
   同时更新 b: b = b+10
如果 b 大于 0:
   a = B-A
   b 不变

如果 a 小于 0:
   更新 a: a = a+10
====================== 下面使用python实现上面算法,以及运行结果 ==============
def multiply8889(digits):
    A,B,C,D = int(digits),int(digits),int(digits),int(digits)
    if D!= 0:
      d = 10-D
      c = D-C-1
    else:
      d = 0
      c = -C

    if c <0:
      c = c+10
      b = C-B-1
    else:
      b = C-B

    if b <0:
      b = b+10
      a = B-A-1
    else:
      a = B-A
      
    if a<0:
      a = a+10

    number = a*1000+b*100+c*10+d
    print 'answer:'+digits+'=>'+str(number)
    print 'check:'+'8889''*'+str(number)+'='+str(8889*number)
    return
   
multiply8889('9369')
multiply8889('2412')
multiply8889('7889')
multiply8889('9160')
multiply8889('0668')
multiply8889('8059')
multiply8889('8002')
multiply8889('2908')
multiply8889('5094')
multiply8889('5992')


======== 运行结果 =======================
answer:9369=>4321
check:8889*4321=38409369

answer:2412=>1708
check:8889*1708=15182412

answer:7889=>1001
check:8889*1001=8897889

answer:9160=>2440
check:8889*2440=21689160

answer:0668=>6012
check:8889*6012=53440668

answer:8059=>2531
check:8889*2531=22498059

answer:8002=>2018
check:8889*2018=17938002

answer:2908=>6172
check:8889*6172=54862908

answer:5094=>5846
check:8889*5846=51965094

answer:5992=>3928
check:8889*3928=34915992

喜欢 发表于 2014-8-28 09:50:38

不爱吱声 发表于 2014-8-27 18:36
算法:
if D 等于 0:
    d = 0


耶!你是俺滴知音~俺基本上就是这么做的。{:189:}

不过,你是否需要阐明一下你的算法呢?如果有人说不懂,你怎么办?

喜欢 发表于 2014-8-28 09:55:22

黑洞的颜色 发表于 2014-8-27 16:57
抱歉,文笔不好,写算法用的时间比想出来的时间还长,也没说明白。好像匆忙中也没有贴全。

步骤为


你这个好复杂,需要慢慢消化。尤其不明觉厉的是
其各位数字之和要反复加到只剩一位: 8+2+9=19 =》10 =》1
这部分是怎么来的?做什么用的?

喜欢 发表于 2014-8-28 10:00:46

独角兽 发表于 2014-8-27 15:25
喜欢gg喜欢我,我就接着写了。

最近电脑上爱坛少了,一般就是手机扫一眼,所以错过了好些帖子,日志什么 ...

你这个我也得慢慢消化~

不爱吱声 发表于 2014-8-28 10:23:31

喜欢 发表于 2014-8-27 19:50
耶!你是俺滴知音~俺基本上就是这么做的。

不过,你是否需要阐明一下你的算法呢?如果有人说不 ...

简单说一下,

abcd*8889 = abcd*10000-abcd*1111
不考虑借位的话
(1)D = 10-d => d=10-D
(2)C = 10-d-c
         (1)-(2)=> c=D-C
(3)B = 10-d-c-b
      (2)-(3)=> b=C-B
(4)A = 10-d-c-b-a
         (3)-(4)=> a=B-A

然后考虑借位,就是最后的算法。


喜欢 发表于 2014-8-28 10:53:37

不爱吱声 发表于 2014-8-27 21:23
简单说一下,

abcd*8889 = abcd*10000-abcd*1111


行,有你说的垫底,我可以不说什么了!{:189:}
花哦!{:237:}

独角兽 发表于 2014-8-28 11:39:37

不爱吱声 发表于 2014-8-28 10:23
简单说一下,

abcd*8889 = abcd*10000-abcd*1111


二当家的厉害,觉得这就是正道终极解法了。

有一点说得不太准确,10-x不是不考虑借位,是考虑了最正常的只借一位的情况。然后对特殊情况进行修改,比如 D=0, d=0,不需借位;x>=10,多借一位。但是,是不是漏掉了x>=20的修正呀?

二当家的用你的程序算一下ABCD=1111,看看答案是多少?

另外,都算到这份上了,不用编程,口算就行了。编程最大的优势就是傻骡子计算机不怕累,让它去排除去吧。咱们就不用动脑筋推导了{:189:}

不爱吱声 发表于 2014-8-28 13:05:33

独角兽 发表于 2014-8-27 21:39
二当家的厉害,觉得这就是正道终极解法了。

有一点说得不太准确,10-x不是不考虑借位,是考虑了最正常 ...

不考虑借位的意思是不用考虑借位的不同情况,不是不借位,呵呵,写得着急了点.

编这种小程序也就是一两分钟的事儿,当时原本正在编其他的程序,随手就写了,这也是为什么我喜欢python的原因.

程序是为了比较方便地验证算法,省得还得自己算,10个还容易,成百上千的验算就不容易了,好处是可以一劳永逸地把所有的数都验证了,而不仅仅局限于这10个,总的来说还是程序更方便啊.

你可能想多了,用这种递进似算法不会出现借2位的情况阿,因为后一个与前一个只差一个数位.

我刚刚用我的算法程序遍历了所有的可能的数,全部都计算正确了.(程序见下面)

=======================遍历程序=====================
def multiply8889(digits):
    A,B,C,D = int(digits),int(digits),int(digits),int(digits)
    if D!= 0:
      d = 10-D
      c = D-C-1
    else:
      d = 0
      c = -C

    if c <0:
      c = c+10
      b = C-B-1
    else:
      b = C-B

    if b <0:
      b = b+10
      a = B-A-1
    else:
      a = B-A
      
    if a<0:
      a = a+10

    number = a*1000+b*100+c*10+d
    return number

def check(digits):
    number = multiply8889(digits)
    if digits != str(8889*number)[-4:]: # last four digits
      return False
    else:
      return True

def print_result(digits):
    number = multiply8889(digits)
    print 'answer:'+digits+'=>'+str(number)
    print 'check:'+'8889''*'+str(number)+'='+str(8889*number)
   
anywrong = False
for i0 in range(1,10):
for i1 in range(10):
    for i2 in range(10):
      for i3 in range(10):
         digits = str(i0)+str(i1)+str(i2)+str(i3)
         if not check(digits):
               anywrong = True
               break

if not anywrong:
    print "The algorithm is correct!"
else:
    print "The algorithm is incorrect!"


print_result('1111')
=======================最后结果=========================
The algorithm is correct!


answer:1111=>9999
check:8889*9999=88881111

独角兽 发表于 2014-8-28 13:35:18

不爱吱声 发表于 2014-8-28 13:05
不考虑借位的意思是不用考虑借位的不同情况,不是不借位,呵呵,写得着急了点.

编这种小程序也就是一两分钟 ...

呵呵,牛!

我没用你的算法算,所以看下来觉得好像少了一种情况似的。如果没少的话,我还得再去想为啥20多也不例外。我估摸着是每次10啊10的补上了,就没20啥事了。

我不会编程,所以觉得编程麻烦。但是现在觉得用程序算胜在思路简单,步骤麻烦点其实没啥。思路复杂了,更容易想错,或者想不出来。还似乎计算机厉害,跟少林寺罗汉拳似的。{:189:}

不爱吱声 发表于 2014-8-28 13:45:19

独角兽 发表于 2014-8-27 23:35
呵呵,牛!

我没用你的算法算,所以看下来觉得好像少了一种情况似的。如果没少的话,我还得再去想为啥20 ...

如果你想学习一门编程语言就推荐你学python,是最接近自然语言的,而且数据结构丰富,有丰富的库,我现在工作中编程序基本全靠python搞定,可以实现非常复杂的功能,不管是科学计算,还是用户接口界面都可以.而且完全免费哦.

放弃你学的 C 吧,python 走起.https://www.python.org/

我使用pythonxy package写工作上用的软件:
http://code.google.com/p/pythonxy/

独角兽 发表于 2014-8-28 14:07:26

不爱吱声 发表于 2014-8-28 13:45
如果你想学习一门编程语言就推荐你学python,是最接近自然语言的,而且数据结构丰富,有丰富的库,我现在工作 ...

嘿嘿,其实我是看了一本java教程。当然,记住多少我就不知道了。就是觉得我怎么能不会编程呢,感觉像是放弃了很大一片天空似的。下面有空我再想看编程的东西就看这个蟒蛇。你和轧叔都这么喜欢蟒蛇呢。

喜欢 发表于 2014-8-28 21:27:52

不爱吱声 发表于 2014-8-28 00:05
不考虑借位的意思是不用考虑借位的不同情况,不是不借位,呵呵,写得着急了点.

编这种小程序也就是一两分钟 ...

这个太棒了!{:237:}{:222:}
(等我有分额了再评分~)
本来我还想写个程序呢(好久没写了,若写还得费点儿工夫),这下也不用写了。

最喜欢这样严格的思路了,滴水不漏,童叟无欺,久经考验!{:189:}

喜欢 发表于 2014-8-28 21:48:59

独角兽 发表于 2014-8-27 22:39
二当家的厉害,觉得这就是正道终极解法了。

有一点说得不太准确,10-x不是不考虑借位,是考虑了最正常 ...

二当家的编程,一是为了严格——电脑不允许手误、口误之类,你说的每一个字都必须对,它才认可;二是为了遍历——所有可能的题都对了,你出题的还有什么说的?那算法是肯定对了!

喜欢 发表于 2014-8-28 23:42:32

本帖最后由 喜欢 于 2014-8-28 11:04 编辑

我来说说我做这题的答案吧。那天折腾了半天,不让它见见天日它也难受!

先说算法,即第三重玩法——掌握了这方法,即使是一年级的小朋友也可以去变这个魔术了!

已知某数abcd乘以8889所得尾数为ABCD,求abcd。

拿来一道题,基本上眼睛盯着那ABCD四个数字就能把答案abcd说出来了。因为只要做这四个数字间的20以内的减法。只不过要从最后一位往前算起,按照d、c、b、a的次序。
比如第1题,ABCD=9026
d=10-D=10-6=4
c=D-C-1=6-2-1=3
b=C-B=2-0=2
a=B-A=0-9=1
咦?0-9不够减怎么办?你就+10,当它是10-9就行了!

简单吗?会了吗?{:soso_e104:}

拿第2题试试手:ABCD=2412
你的答案是多少?
8,1,7,2?——第二个数字忘记-1了吧?记住,(答案中倒数)第二个数字c必须有“-1”才对!
8,0,7,2?——嗯,这是你找答案的次序,答案只要反过来就行了;
2708?——这次对啦!
不错,你连中间那个“1-4”不够减都知道当成“11-4”去做了,很好!


嗯?你要去找小伙伴变魔术了?等等,先别走。这里还有绝招呢。不是所有的题都那么简单。事实上有很多题需要用绝招来对付!
什么样的题呢?就是答案abcd里面,后两位相加超过9的数,和后三位相加超过9的数,还有后三位相加超过18的数。

刚才我讲算法的时候就有小朋友问为什么要从后往前算,直接从前往后算不是更直接吗?等我讲完绝招你就知道为什么啦。

注意我刚才教的四个算式:
1,d=10-D
2,c=D-C-1
3,b=C-B
4,a=B-A

第一个比较特殊,是每次都用10做被减数,要单独记住;
第二个也比较特殊,它每次都要做完相邻两数的减法后再-1,也要记牢;
那么后面的两个算式就永远不用-1吗?
不是的!它们有的时候也要-1!——这就是绝招。什么时候用绝招呢?你会做超过10的加法吗?(会做30以内的加法就行。)
要把答案里面的数字相加,d+c的结果决定第三个算式要不要-1;d+c+b的结果决定第四个算式要不要-1。
这就是说你要先知道d和c才能知道b;要先知道d、c和b才能知道a——所以我们得反着找答案。

好,现在就是对付那一大堆“难题”的绝招:

绝招1

当(d+c)>9,b=C-B-1;——此时后位减前位需再减1,才得出b;
这个时候你还要注意这个:当(d+c+b)>18,a=B-A-1——即此时后位减前位需再减1,才得出a。

举个例子:
ABCD=5992,
d=10-D=10-2=8
c=D-C-1=12-9-1=2(注意,2-9不够减了,自动变成12-9)
上面这两个算式永远这样,不会变;
下来两个算式就要用到绝招了,因为我们发现,已经算出来的两个数字(8+2)=10>9了!那么就要多-1:
b=9-9-1=9(——注意,9-9=0,后面又不够减了,那就+10再减,10-1=9。)
这里有了-1就要注意后面一个数字a的算法了,果然(d+c+b)=(8+2+9)=19>18,那么算a的时候也要-1:
a=B-A-1=9-5-1=3
答案是,abcd=3928

再举一个例子巩固一下:
ABCD=5094
d=10-D=10-4=6
c=D-C-1=14-9-1=4
b=C-B-1=9-0-1=8——为什么这里要-1呢?因为(d+c)=10>9
a=B-A=9-3=6——咦,这里不需要-1吗?不需要!因为(d+c+b)=6+4+8=18——没有大于18就不要用绝招!

绝招2
当(d+c)<=9,算b的时候不用绝招。那么算a的时候还需要小心吗?需要!这时需要判断(d+c+b)是否大于9——注意这时用9判断,而不是18(实际上不可能大于18)。
当(d+c)<=9, 且(d+c+b)>9时,a=B-A-1——这个时候算a就要用到“-1绝招”!

例:
ABCD=3904
d=10-4=6
c=4-0-1=3
b=10-9=1——即使(d+c)=6+3=9,也无需使用绝招
a=B-A-1=9-3-1=5——要用绝招了,因为(d+c+b)=6+3+1=10>9

至此,算法全部教完。{:soso_e116:}

现在你可以做主帖里面的10道题了,并对照一下答案,看看你能不能做对。

题目:
1,ABCD=9369;
2,ABCD=2412;
3,ABCD=7889;
4,ABCD=9160;
5,ABCD=0668;
6,ABCD=8059;
7,ABCD=8002;
8,ABCD=2908;
9,ABCD=5094;
10,ABCD=5992;


答案:
1,ABCD=9369;abcd=4321
2,ABCD=2412;abcd=1708
3,ABCD=7889;abcd=1001
4,ABCD=9160;abcd=2440
5,ABCD=0668;abcd=6012
6,ABCD=8059;abcd=2531
7,ABCD=8002;abcd=2018
8,ABCD=2908;abcd=6172
9,ABCD=5094;abcd=5846
10,ABCD=5992;abcd=3928


===================================

下面是给大人看的算法。呵呵。

1,从最后一位d算起,依次向左,求出c、b、a。

2,d=“D对10求补”。例:D=3,则d=7。

3,c=D-C-1,不够减时+10再减(下同)。

例:D=5,C=2,则c=5-2=3;
       D=4,C=6,则c=10+D-C-1=10+4-6-1=7;
       D=C,则c=10+D-C-1=9。

4,b分两种情况,

4.1 当(d+c)<=9,b=C-B;此时只管后位减前位,即得出b;
4.2 当(d+c)>9,b=C-B-1;此时后位减前位需再减1,才得出b。

5,a分四种情况,

当b无需-1,则此时用9做关键数,决定是否-1:
5.1 当(d+c)<=9,且当(d+c+b)<=9,a=B-A,即此时只管后位减前位,即得出a;例5:ABCD=8002,则abcd=2018
(——b、a都直接相减得出)
5.2 当(d+c)<=9,且当(d+c+b)>9,a=B-A-1,即此时后位减前位需再减1,才得出a;例6:ABCD=2908,则abcd=6172
(——b直接得出、a需-1)

当b已经-1,则此时用18做关键数,决定是否-1:
5.3 当(d+c)>9,且当(d+c+b)<=18,a=B-A,即此时只管后位减前位,即得出a;例7:ABCD=5094,则abcd=5846
(——b需-1、a直接得出)
5.4 当(d+c)>9,且当(d+c+b)>18,a=B-A-1,即此时后位减前位需再减1,才得出a;例8:ABCD=5992,则abcd=3928
(——b、a都需-1)

喜欢 发表于 2014-8-29 02:12:11

本帖最后由 喜欢 于 2014-8-28 13:20 编辑

解释一下我那算法的推理过程——第四重玩法。

原理如下:

设有四位正整数形如abcd,将其乘以8889,则有

abcd*8889=abcd*(10000-1000-100-10-1)=
abcd0000
- abcd000
-   abcd00
-   abcd0
-       abcd
-------------------
       ABCD

设其结果的末尾4位形如ABCD,我们只看后面黑体字部分的四位数,其每一列的减法。则有

最初,十位、百位、千位肯定都被借位1,变成9,而个位得到10,因此,

D这里的被减数肯定是10,
D=(10-d)
=>d=10-D

C这里的被减数肯定是9,
当(d+c)<=9,
C=9-d-c=(10-1)-d-c=(10-1)-(10-D)-c=D-c-1
=>c=D-C-1
当(d+c)>9,向前借位,+10再减,(+10或-10只影响前面一位,不影响本位的数字。我们称为“公理1”。)
C=10+9-d-c=10+(10-1)-(10-D)-c=D-c-1+10
=>c=(D-C-1)+10=D-C-1(公理1)
=>c=D-C-1

B这里的被减数,当(d+c)<=9,是9;当(d+c)>9,是8(因为又被借过1),
当(d+c)<=9,
B=9-d-c-b=(10-1)-d-c-b=(10-1)-(10-D)-(D-C-1)-b=C-b
=>b=C-B
当(d+c)>9,
B=8-d-c-b=(10-1-1)-d-c-b=(10-1-1)-(10-D)-(D-C+9)-b=C-b-11
=>b=C-B-1-10=C-B-1(公理1)
=>b=C-B-1

万位,A这里,被减数-d-c-b-a=A,

● 当(d+c)<=9,关键数是9,
当(d+c+b)<=9,被减数保持为9;当(d+c+b)>9,被减数是8(又被借过1),

· 当(d+c)<=9且(d+c+b)<=9,
A=9-d-c-b-a=(10-1)-d-c-b-a=(10-1)-(10-D)-(D-C-1)-(C-B)-a=B-a
=>a=B-A
例1:ABCD=8059,则abcd=2531——(d+c)<=9, (d+c+b)<=9

· 当(d+c)<=9且(d+c+b)>9,
A=8-d-c-b-a=(10-1-1)-d-c-b-a=(10-1-1)-(10-D)-(D-C-1)-(C-B)-a=B-a-1
=>a=B-A-1
例2:ABCD=3904,则abcd=5136——(d+c)<=9, (d+c+b)>9

● 当(d+c)>9,因为(d+c+b)肯定>9,故万位至少曾再被借位1,即A这里的被减数,至多是8,也许是7。所以,此时用来判断的关键数是18,
当(d+c+b)<=18(肯定>9),被减数是8(仅被借位1);当(d+c+b)>18,被减数是7(曾被借位2),

· 当(d+c)>9且(d+c+b)<=18
A=8-d-c-b-a=(10-1-1)-d-c-b-a=(10-1-1)-(10-D)-(D-C-1)-(C-B-1)-a=B-a
=>a=B-A
例3:ABCD=6091,则abcd=4819——(d+c)>9, (d+c+b)<=18

· 当(d+c)>9且(d+c+b)>18,
A=7-d-c-b-a=(10-1-2)-d-c-b-a=(10-1-2)-(10-D)-(D-C-1)-(C-B-1)-a=B-a-2+1
=>a=B-A-1
例4:ABCD=1994,则abcd=7946——(d+c)>9, (d+c+b)>18


证明完毕。

喜欢 发表于 2014-8-29 10:53:05

接着来。这次是爆炸性的答案!

俺说过,俺把这题目给了一个朋友——一直被我奉为聪明人的朋友。果然不负我望。不到十分钟,答案回来了,就两句话:

把ABCD乘以9;

8889x9=80001。

我告诉ta我的算法后,又给我一句话,长一点的:

你用竖式做“ABCD0-ABCD”,看看跟你那算法一样不一样?

我傻了,我服了!

我知道什么叫巧劲,什么叫窍门,什么叫题眼了!

我知道什么叫豁然开朗了!

我知道世界上真的存在聪明人了!


于是我的算法被简化了,直接就减了啊,从前往后就能说出答案了啊!(只要看后一位是否够减/是否借1就行了!)不用管什么(d+c)、(d+c+b)的值了!

即使最极端的ABCD=5992,也能立刻算出ABCD=3928来!



页: 1 2 [3] 4
查看完整版本: 【动脑筋】数学魔术