设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
楼主: 喜欢
打印 上一主题 下一主题

[其他] 【动脑筋】数学魔术

[复制链接]
  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    41#
     楼主| 发表于 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,我这是很严格的,呵呵。。。


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

    该用户从未签到

    42#
    发表于 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的乘法出发找出了这个所谓魔术的解法,心满意足的睡觉去了。。。

    评分

    参与人数 1爱元 +3 收起 理由
    喜欢 + 3 油菜

    查看全部评分

    该用户从未签到

    43#
    发表于 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 神牛师傅来鉴定一下,这个程序编得够简洁吧

  • TA的每日心情
    开心
    2024-1-5 22:47
  • 签到天数: 1231 天

    [LV.10]大乘

    44#
    发表于 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

    回头写原理

    评分

    参与人数 1爱元 +6 收起 理由
    喜欢 + 6 给力

    查看全部评分

  • TA的每日心情
    奋斗
    2022-2-8 01:13
  • 签到天数: 171 天

    [LV.7]分神

    45#
    发表于 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[0]),int(digits[1]),int(digits[2]),int(digits[3])
        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 11:04

    评分

    参与人数 1爱元 +6 收起 理由
    喜欢 + 6 精彩

    查看全部评分

  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    46#
     楼主| 发表于 2014-8-28 09:50:38 | 只看该作者
    不爱吱声 发表于 2014-8-27 18:36
    算法:
    if D 等于 0:
        d = 0

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

    不过,你是否需要阐明一下你的算法呢?如果有人说不懂,你怎么办?
  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    47#
     楼主| 发表于 2014-8-28 09:55:22 | 只看该作者
    黑洞的颜色 发表于 2014-8-27 16:57
    抱歉,文笔不好,写算法用的时间比想出来的时间还长,也没说明白。好像匆忙中也没有贴全。

    步骤为

    你这个好复杂,需要慢慢消化。尤其不明觉厉的是
    其各位数字之和要反复加到只剩一位: 8+2+9=19 =》10 =》1
    这部分是怎么来的?做什么用的?
  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    48#
     楼主| 发表于 2014-8-28 10:00:46 | 只看该作者
    独角兽 发表于 2014-8-27 15:25
    喜欢gg喜欢我,我就接着写了。

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

    你这个我也得慢慢消化~
  • TA的每日心情
    奋斗
    2022-2-8 01:13
  • 签到天数: 171 天

    [LV.7]分神

    49#
    发表于 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

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


  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    50#
     楼主| 发表于 2014-8-28 10:53:37 | 只看该作者
    不爱吱声 发表于 2014-8-27 21:23
    简单说一下,

    abcd*8889 = abcd*10000-abcd*1111

    行,有你说的垫底,我可以不说什么了!
    花哦!

    该用户从未签到

    51#
    发表于 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,看看答案是多少?

    另外,都算到这份上了,不用编程,口算就行了。编程最大的优势就是傻骡子计算机不怕累,让它去排除去吧。咱们就不用动脑筋推导了
  • TA的每日心情
    奋斗
    2022-2-8 01:13
  • 签到天数: 171 天

    [LV.7]分神

    52#
    发表于 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[0]),int(digits[1]),int(digits[2]),int(digits[3])
        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

    该用户从未签到

    53#
    发表于 2014-8-28 13:35:18 | 只看该作者
    不爱吱声 发表于 2014-8-28 13:05
    不考虑借位的意思是不用考虑借位的不同情况,不是不借位,呵呵,写得着急了点.

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

    呵呵,牛!

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

    我不会编程,所以觉得编程麻烦。但是现在觉得用程序算胜在思路简单,步骤麻烦点其实没啥。思路复杂了,更容易想错,或者想不出来。还似乎计算机厉害,跟少林寺罗汉拳似的。
  • TA的每日心情
    奋斗
    2022-2-8 01:13
  • 签到天数: 171 天

    [LV.7]分神

    54#
    发表于 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/

    该用户从未签到

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

    嘿嘿,其实我是看了一本java教程。当然,记住多少我就不知道了。就是觉得我怎么能不会编程呢,感觉像是放弃了很大一片天空似的。下面有空我再想看编程的东西就看这个蟒蛇。你和轧叔都这么喜欢蟒蛇呢。
  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    56#
     楼主| 发表于 2014-8-28 21:27:52 | 只看该作者
    不爱吱声 发表于 2014-8-28 00:05
    不考虑借位的意思是不用考虑借位的不同情况,不是不借位,呵呵,写得着急了点.

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

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

    最喜欢这样严格的思路了,滴水不漏,童叟无欺,久经考验!
  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    57#
     楼主| 发表于 2014-8-28 21:48:59 | 只看该作者
    独角兽 发表于 2014-8-27 22:39
    二当家的厉害,觉得这就是正道终极解法了。

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

    二当家的编程,一是为了严格——电脑不允许手误、口误之类,你说的每一个字都必须对,它才认可;二是为了遍历——所有可能的题都对了,你出题的还有什么说的?那算法是肯定对了!
  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    58#
     楼主| 发表于 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就行了!

    简单吗?会了吗?

    拿第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

    至此,算法全部教完。

    现在你可以做主帖里面的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)

  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    59#
     楼主| 发表于 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


    证明完毕。
  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 3166 天

    [LV.Master]无

    60#
     楼主| 发表于 2014-8-29 10:53:05 | 只看该作者
    接着来。这次是爆炸性的答案!

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

    把ABCD乘以9;

    8889x9=80001。


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

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

    我傻了,我服了!

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

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

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


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

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



    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2024-12-23 04:10 , Processed in 0.083309 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表