爱吱声

标题: 【动脑筋】数学魔术 [打印本页]

作者: 喜欢    时间: 2014-8-27 00:26
标题: 【动脑筋】数学魔术
昨天在天才帮出了一道题。既然天才帮声势浩大,帮众日多,我以为在那里出题就等于在版面出题了。
不料还是有很多人没看见这题,就是说还应该发在版面才能给更多的人看到。
可是,找来找去,不知道发在哪个版面合适。有心发在研究生院,但一看规矩,得有论文水平才行。俺还是别捣乱了。
就这儿吧,日志随笔,谁都能看见了,是吧?现在出题。

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

本题还是取自七旬老人发明"数学魔术" 5秒猜出你心里想的数

请你想一个四位的自然数abcd,把它乘以8889,告诉我乘积的4位尾数ABCD,我就能知道你想的是什么数。
例如:
如果你告诉我尾数是9026,则我知道你原来想的那个数是1234;
如果你告诉我尾数是7421,则我知道你原来想的那个数是6789;
如果你告诉我尾数是5679,则我知道你原来想的那个数是1111;
……


本题有几重玩法。

第一重:请大家出题,我来给出答案。
即,你来给出尾数ABCD,我来给出原数abcd。
例:你说“ABCD=9026”,我说:“abcd=1234”。——这就是那七旬老者的玩法,即所谓“数学魔术”。很神奇?

第二重:我来出题,参与者给出答案。
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
这些是原数乘以8889之后的末尾四位,你能给出10个原数其中一个也行,我会给你评分~

第三重:打擂——参与者给出算法。
注意,我的算法都不是从网上找来的,而是自己推理演算得出的。也请你注明你的算法是找来的还是算出来的。——我都会给你评分~

第四重:揭榜——参与者推演出算法的原理。
我就是为了寻求这个算法并推演严格的逻辑,而花了大半天的时间!
你若能给出清晰无误的推演过程,你就是俺的知音!俺的偶像!以后就有人跟俺一起玩了~

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

昨天出完这题后。我把这题给了某聪明的朋友。
只肖几分钟,朋友就给出了一个算法,比俺的算法更简单易记——而且我相信这就是那老者的算法。
因为我的算法推演过程比较复杂,算法相对而言不大容易记住,算的过程也需小心谨慎,稍不留神就容易出错。

不过,凭心而论,我的算法也不是不可取,因为某种意义上讲,俺的算法还是更容易心算出来的。没有经过心算训练的人用我的算法能更快给出答案呢!

所以,无论你推演出了哪种算法,你都是好样的!



(嗯?还可以选来自哪个群组?选了天才帮,看看有个什么效果。)[groupid=191]天才帮[/groupid]
作者: 沉宝    时间: 2014-8-27 02:24
很简单,8889=10000-1111。

没时间了,回头再写。
作者: 仁    时间: 2014-8-27 02:59
本帖最后由 仁 于 2014-8-27 03:28 编辑

个位数是0:         D+d=10 or 0
十位数是0:        C+c+d=0, 10, 9 or 19  (如果 D+d =0 , 可能的结果是0或10,如果D+d=10, 可能的结果是9或19)
...


(10000 - 1000 -100 - 10 -1 )* abcd = 10000 * x  + ABCD
也就是说 abcd000 + abcd00 + abcd0 + abcd + ABCD 的结果一定是可以被10000整除,也就是说从个位到千位都是0。
作者: 牛腰    时间: 2014-8-27 03:48
本帖最后由 牛腰 于 2014-8-27 04:00 编辑

abcd X 8889 = abcd X (1,0000 - 1111) = abcd,0000 - aaaa000 - bbbb00 - cccc0 - dddd

只算最后四位数的话,那就是 (1),0000 - a000 - bb00 - ccc0 - dddd

如果ABCD=9369。能决定个位数的只有d,所以d=10-9=1

十位数 = 9 - 6 - c - d, 那么 c = 9 - 6 - 1 = 2

百位数 = 9(或19) - 3 - b - c - d,b = 9 - 3 - 1 - 2 = 3

千位数 = 9(或19) - 9 - a - b - c - d,a = 19 - 9 - 1 - 2 - 3 = 4

验算:4321 X 8889 = 3840,9369

上面如果ABCD的个位数是0,那么十位数就从10而不是9开始减起。再往后推也是一样,后面的借位决定每一位数的开始值是10,9还是8。

自己想出来的。
作者: 喜欢    时间: 2014-8-27 03:59
牛腰 发表于 2014-8-26 14:48
abcd X 8889 = abcd X (1,0000 - 1111) = abcd,0000 - aaaa000 - bbbb00 - cccc0 - dddd

只算最后四位数的 ...

用你的方法试试我出的10道题?如果没时间就只试最后两道吧~
作者: 喜欢    时间: 2014-8-27 04:02
仁 发表于 2014-8-26 13:59
个位数是0:         D+d=10 or 0
十位数是0:        C+c+d=0, 10, 9 or 19  (如果 D+d =0 , 可能的结果是0或10,如果D+d ...
也就是说 abcd000 + abcd00 + abcd0 + abcd + ABCD 的结果一定是可以被10000整除


这句话似乎不是你本来想表达的意思?再仔细看看?
作者: 牛腰    时间: 2014-8-27 04:08
本帖最后由 牛腰 于 2014-8-27 04:14 编辑
喜欢 发表于 2014-8-27 03:59
用你的方法试试我出的10道题?如果没时间就只试最后两道吧~


ABCD = 5094

d = 10 - 4 = 6
c = 19 - 9 - 6 = 4
b = 18 - 0 - 6 - 4 = 8
a = 28 - 5 - 6 - 4 - 8 = 5
验算:5846 X 8889 = 5196,5094


ABCD = 5992
d = 10 - 2 = 8
c = 19 - 9 - 8 = 2
b = 28 - 9 - 2 - 8 = 9
a = 27 - 5 - 8 - 2 - 9 = 3
验算:3928 X 8889 = 3491,5992

上面没说清楚的是(1)如果一位数的减法得了负数,就加10的倍数,直到得出一个个位正数,(2)上一位数的起始值向上round到最小的10的倍数,10减去它的十位数就是下一位数起始值的个位数。
作者: 喜欢    时间: 2014-8-27 04:12
牛腰 发表于 2014-8-26 15:08
ABCD = 5094

d = 10 - 4 = 6

你如何确定那里是19或18或28或27的?
每道题都做减法大竖式吗?
作者: 牛腰    时间: 2014-8-27 04:14
喜欢 发表于 2014-8-27 04:12
你如何确定那里是19或18或28或27的?
每道题都做减法大竖式吗?

补充了我上面的回复。
作者: 喜欢    时间: 2014-8-27 04:20
牛腰 发表于 2014-8-26 15:14
补充了我上面的回复。

能不能再说明白点儿?因为这魔术弄好了应该人人会玩呢。
你能用实例(我的10道题就行)把玩的过程解释清楚、教会旁人么?
作者: 牛腰    时间: 2014-8-27 04:22
本帖最后由 牛腰 于 2014-8-27 04:26 编辑
喜欢 发表于 2014-8-27 04:12
你如何确定那里是19或18或28或27的?
每道题都做减法大竖式吗?


以ABCD=5992为例

d: 10-2=8

c: 起始值个位数是10-1=9,9+8=17大于10,所以起始值是19, 19-9-8=2

b: 起始值个位数是10-2 (19变20) = 8,9+8+2=19,起始值就是28才能得到一个个位数:28-9-2-8=9

a: 起始值个位数是10-3(28变30)=7, 5+8+2+9=24,起始值必须是27,27-5-8-2-9=3。

想着容易,解释起来挺饶的
作者: 仁    时间: 2014-8-27 04:27
喜欢 发表于 2014-8-27 04:02
这句话似乎不是你本来想表达的意思?再仔细看看?

要想严谨地说明还必叫麻烦,但是思路在那里,实际操作很简单。ABCD=9026

D+d= 0 or 10 >>>> d=4
C+c+d=9 or 19 >>>> c=3
B+b+c+d=9 or 19 or 29 >>> b=2
A+a+b+c+d =0 or 10 or 20or 30 >>>> a=1

最后四位数字都是0:
1234000 + 123400 + 12340 + 1234 + 9026=1380000
作者: 黑洞的颜色    时间: 2014-8-27 04:31
有趣
我自己的解法如下
1. 令 MNOP=10000-ABCD
2. 为了方便说明,
定义一个数X的各位和为 sum.dig(X).
定义mod10(Y): (i) Y>0,则为Y的个位数字
(i)

1. d=P
2. O-
作者: 喜欢    时间: 2014-8-27 04:36
牛腰 发表于 2014-8-26 15:22
以ABCD=5992为例

d: 10-2=8

我觉得做起来也很绕啊,这样的算法,能在5秒内就把任何一题心算出来么?
作者: 喜欢    时间: 2014-8-27 04:41
仁 发表于 2014-8-26 15:27
要想严谨地说明还必叫麻烦,但是思路在那里,实际操作很简单。ABCD=9026

D+d= 0 or 10 >>>> d=4
B+b+c+d=9 or 19 or 29 >>> b=2
A+a+b+c+d =0 or 10 or 20or 30 >>>> a=1


两个式子中,前一个一定是9/19/29之一吗?
后一个,怎么会是0/10/20/30之一呢?

你换个例子试试看,比如用我出的10题中后面两个。
作者: 黑洞的颜色    时间: 2014-8-27 04:42
本帖最后由 黑洞的颜色 于 2014-8-27 04:44 编辑

有趣
我自己的解法如下
1. 令 MNOP=10000-ABCD
2. 为了方便说明,
定义一个数X的各位和为 sum.dig(X).
定义mod(Y): (i) Y>=0,则为Y的个位数字 (ii) Y<0, 则为 10 - Y的个位数字
如 mod(3)=7, mod(-2)=8

那么
1. d=P
2. c=mod(O-d)
3. b=mod(N-sum.dig(c+d))
4. a=mod(M-sum.dig(c+c+d))

即先得到10000-ABCD,再从后向前找,减去前面已经找到的数字的和的各位和,如果是负数则加10。

比如
ABCD=7421,
得到2579,
d=9;
c=mod(7-9)=mod(-2)=8;
c+d=17, sum.dig=1+7=8,  b=mod(5-8)=mod(-3)=7
b+c+d=24, sum.dig=2+4=6, a=mod(2-6)=6
得 abcd=6789
  
想明白了算得非常快。
作者: 喜欢    时间: 2014-8-27 04:43
黑洞的颜色 发表于 2014-8-26 15:31
有趣
我自己的解法如下
1. 令 MNOP=10000-ABCD

您这是用电脑算呢还是人脑算呢?

俺们的目的是要用人脑算,5秒钟就出结果。
作者: 牛腰    时间: 2014-8-27 04:45
喜欢 发表于 2014-8-27 04:36
我觉得做起来也很绕啊,这样的算法,能在5秒内就把任何一题心算出来么? ...

刚试了一下第8题,ABCD=2908,心算出6172,可以做到。练习一下应该可以做得更快。
作者: 黑洞的颜色    时间: 2014-8-27 04:47
喜欢 发表于 2014-8-27 04:43
您这是用电脑算呢还是人脑算呢?

俺们的目的是要用人脑算,5秒钟就出结果。 ...

仔细看看就发觉不过是先做一个10000减法,然后不断加减个位数字而已。
作者: 喜欢    时间: 2014-8-27 04:57
黑洞的颜色 发表于 2014-8-26 15:42
有趣
我自己的解法如下
1. 令 MNOP=10000-ABCD

哎哟,你这个我已经判断不能了!

貌似是对的?你自己用我那十题把这算法验算一下(十遍)好吗?


作者: 喜欢    时间: 2014-8-27 04:59
牛腰 发表于 2014-8-26 15:45
刚试了一下第8题,ABCD=2908,心算出6172,可以做到。练习一下应该可以做得更快。 ...

你这算法算是一家。

不过,还有其它算法哦。想不想继续?
作者: 黑洞的颜色    时间: 2014-8-27 05:00
本帖最后由 黑洞的颜色 于 2014-8-27 05:09 编辑
喜欢 发表于 2014-8-27 04:57
哎哟,你这个我已经判断不能了!

貌似是对的?你自己用我那十题把这算法验算一下(十遍)好吗?{ ...


1,ABCD=9369
     to 0631 to 4321
2,ABCD=2412
    to 7588 to 1708
3,ABCD=7889
    to 2111 to 1001
4,ABCD=9160
    to 0840 to 2440
5,ABCD=0668
6,ABCD=8059
7,ABCD=8002
8,ABCD=2908
9,ABCD=5094
10,ABCD=5992


But now I think about it, maybe it would be easier if we noticed abcd*8889= abcd0000-1001*abcd. Sorry must run.

作者: 喜欢    时间: 2014-8-27 05:03
黑洞的颜色 发表于 2014-8-26 15:47
仔细看看就发觉不过是先做一个10000减法,然后不断加减个位数字而已。

可是您这算法的原理何在呢?能解释到俺(们?)能听懂的程度么?

看来脑袋瓜好使的人真不少啊!这么绕的算法都能想出来!非常佩服!

不过,有更简单的算法哎!
作者: 喜欢    时间: 2014-8-27 05:05
黑洞的颜色 发表于 2014-8-26 16:00
1,ABCD=9369

2,ABCD=2412

什么?您怎么净晃我!这是题目哎,答案呢?
作者: 黑洞的颜色    时间: 2014-8-27 05:09
喜欢 发表于 2014-8-27 05:05
什么?您怎么净晃我!这是题目哎,答案呢?

sorry, fat finger and I must run now.
作者: 喜欢    时间: 2014-8-27 05:12
喜欢 发表于 2014-8-26 15:02
这句话似乎不是你本来想表达的意思?再仔细看看?

@仁

我重看了一遍你那回复,你是对的,说法没有问题。我那回复说明我当时没理解。


作者: 喜欢    时间: 2014-8-27 05:17
黑洞的颜色 发表于 2014-8-26 16:00
1,ABCD=9369
     to 0631 to 4321
2,ABCD=2412

嗯。你也要改到比较简洁的路上来了么?
不过你说的有个口误吧?回来再仔细看看~
作者: 仁    时间: 2014-8-27 05:36
喜欢 发表于 2014-8-27 04:41
两个式子中,前一个一定是9/19/29之一吗?
后一个,怎么会是0/10/20/30之一呢?

这是要看他们后面那位数上劲了几个上来。后面进1,就是9结尾,后面进2 就是8 结尾,没有进位,就是0结尾。

佩服你的执著。我一般都是明确思路就可以了。这里用地10题演算:ABCD=5992

since  D+d=x0   so d=8 and x=1
since C+c+d=y9 so c=2 and y=2
since B+b+c+d=z8 so b=9 and z=3
since A+a+b+c+d=w7 so b=3

abcd=3928
作者: 仁    时间: 2014-8-27 05:39
喜欢 发表于 2014-8-27 05:12
@仁

我重看了一遍你那回复,你是对的,说法没有问题。我那回复说明我当时没理解。

这个要说比较费事,但是做起来比较容易。在你这个帖子出来前,我用第10题演算了。我开始就那么写就不会误会了。
作者: leekai    时间: 2014-8-27 06:21
太难了,脑子疼
作者: 喜欢    时间: 2014-8-27 08:47
仁 发表于 2014-8-26 16:36
这是要看他们后面那位数上劲了几个上来。后面进1,就是9结尾,后面进2 就是8 结尾,没有进位,就是0结尾 ...

明确思路到能明确表达是两个台阶哈!
在中国,反正我学习那会儿,是要求明确表达的,否则没分!
在国外,只要求有答案,脑子里面什么样没人关心。甚至给出四个答案让学生挑。唉,没法评说。

你这里,我还是没看懂哎。

“since  D+d=x0   so d=8 and x=1
since C+c+d=y9 so c=2 and y=2
since B+b+c+d=z8 so b=9 and z=3
since A+a+b+c+d=w7 so b=3”

1,最后一行里面的“b=3”算你手误,减1分吧~
2,形如“y9”的表达式中,y和9的关系是“y9=y*10+9”的意思?没注明,减1分吧~
3,y怎么就等于2了呢?你是说“C+c+d=29”吗?现有C=9, c=2, d=8, 和怎么就是29了呢?
同理,后面的也就没看懂了。

咱们这么说吧。现在你是老师,你得负责把学生教懂啊!不能只你自己明白,学生一头雾水,让ta怎么去变这个数学魔术呢?
作者: 仁    时间: 2014-8-27 09:03
喜欢 发表于 2014-8-27 08:47
明确思路到能明确表达是两个台阶哈!
在中国,反正我学习那会儿,是要求明确表达的,否则没分!
在国外, ...

我的思维有点跳了啊。y是1,向前面那个数位进2. 写成C+c+d+1=y0就清楚了?
作者: 大卫    时间: 2014-8-27 10:17
abcdx8889=abcd*(10000-1111)=abcd*10000-abcd*1111=abcd*10000-*(a*1000+b*100+c*10+d)*1111=abcd*10000-aaaa*1000-bbbb*100-cccc*10-dddd

由于只需计算末尾四位,则公式为:

(1)0000
-------------
     a000
     bb00
      ccc0
-    dddd
-------------
      wxyz
作者: 喜欢    时间: 2014-8-27 10:17
仁 发表于 2014-8-26 20:03
我的思维有点跳了啊。y是1,向前面那个数位进2. 写成C+c+d+1=y0就清楚了?

不懂啊!
有能看懂的人么?
作者: 喜欢    时间: 2014-8-27 10:19
大卫 发表于 2014-8-26 21:17
abcdx8889=abcd*(10000-1111)=abcd*10000-abcd*1111=abcd*10000-*(a*1000+b*100+c*10+d)*1111=abcd*100 ...

然后呢?具体怎么操作,算出答案呢?
作者: 大卫    时间: 2014-8-27 11:33
喜欢 发表于 2014-8-27 10:19
然后呢?具体怎么操作,算出答案呢?

后续解题步骤同4楼,注意借位(公式中以wxyz代替ABCD以免误解)。


答案:
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=2351
7,ABCD=8002;abcd=2531
8,ABCD=2908;abcd=6172
9,ABCD=5094;abcd=5846
10,ABCD=5992;abcd=3928
作者: 独角兽    时间: 2014-8-27 15:52
本帖最后由 独角兽 于 2014-8-27 16:23 编辑

0, 9, 18, 27, 36, 45, 54, 63, 72, 81

1) ABCD=9369: abcd=4321
d=1;
6+1=7; c+d=3; c=2;
3+1=4; b+c+d=6, b=3;
9+1=0, a+b+c+d=10; a=4

2) ABCD=2412; abcd=1708
d=8;
1+1=2; c+d=8; c=0;
4+1=5; b+c+d=15, b=7;
2+1+1=4, a+b+c+d=16; a=1

3) ABCD=7889: abcd=1001
d=1;
8+1=9; c+d=1; c=0;
8+1=9; b+c+d=1, b=0;
7+1=8, a+b+c+d=2; a=1;

4) ABCD=9160; abcd=2440

5) ABCD=06668; 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

第十题题发现了我找到所谓规律的小bug。

d=8
9+1=10, c+d=10, c=2
9+1+1=11, b+c+d=19, b=9
(5+1+1=7, a+b+c+d=23, a=4 -->验算时发现不对)
5+1+2=8, a+b+c+d=22, a=3

附赠11)ABCD=1111, abcd=9999

d=9
1+1=2, c+d=18, c=9
1+2=3, b+c+d=27, b=9
1+3=4, a+b+c+d=36, a=9

哪位小伙伴能把我的解题思路写出来呢?






作者: 喜欢    时间: 2014-8-27 19:04
大卫 发表于 2014-8-26 22:33
后续解题步骤同4楼,注意借位(公式中以wxyz代替ABCD以免误解)。

所以你的算法也是每题都列大竖式。

可以,但不简洁。还有更简洁的算法呢,要不要继续?:)
作者: 喜欢    时间: 2014-8-27 19:08
可了不得!这个推荐是怎么回事啊?!

系统自作聪明推荐的?这么一来就把楼层都弄乱了啊!让人怎么看明白前后因果关系呢?

能不能把自动推荐功能关掉?若要推荐也得由楼主人工推荐啊!

(不会是版主人工推荐的吧?)


作者: 喜欢    时间: 2014-8-27 19:21
独角兽 发表于 2014-8-27 02:52
0, 9, 18, 27, 36, 45, 54, 63, 72, 81

1) ABCD=9369: abcd=4321

独角兽MM终于来了!我就觉得你会来~

你这个是在找规律,或者叫直接找算法。算我主楼说的第三重玩法。

但是你无法解释什么情况下“+1”,什么情况下“+1+1”以至“+1+2”吧?

所以你有两个途经继续,一个是用严格的推理证明你找到的规律;另一个是另辟蹊径——那是存在的。:)

对了,你看看你这做法跟仁做的是不是一回事?他的我就没看懂。

没准儿黑洞的颜色那程序说的也是这样的意思?那个我更没看懂。
作者: 喜欢    时间: 2014-8-28 04:11
独角兽 发表于 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
本帖最后由 独角兽 于 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的乘法出发找出了这个所谓魔术的解法,心满意足的睡觉去了。。。
作者: 独角兽    时间: 2014-8-28 05:09
独角兽 发表于 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 神牛师傅来鉴定一下,这个程序编得够简洁吧


作者: 黑洞的颜色    时间: 2014-8-28 05:57
喜欢 发表于 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
算法:
如果 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 09:50
不爱吱声 发表于 2014-8-27 18:36
算法:
if D 等于 0:
    d = 0

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

不过,你是否需要阐明一下你的算法呢?如果有人说不懂,你怎么办?
作者: 喜欢    时间: 2014-8-28 09:55
黑洞的颜色 发表于 2014-8-27 16:57
抱歉,文笔不好,写算法用的时间比想出来的时间还长,也没说明白。好像匆忙中也没有贴全。

步骤为

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

作者: 喜欢    时间: 2014-8-28 10:00
独角兽 发表于 2014-8-27 15:25
喜欢gg喜欢我,我就接着写了。

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

你这个我也得慢慢消化~
作者: 不爱吱声    时间: 2014-8-28 10:23
喜欢 发表于 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
不爱吱声 发表于 2014-8-27 21:23
简单说一下,

abcd*8889 = abcd*10000-abcd*1111

行,有你说的垫底,我可以不说什么了!
花哦!
作者: 独角兽    时间: 2014-8-28 11:39
不爱吱声 发表于 2014-8-28 10:23
简单说一下,

abcd*8889 = abcd*10000-abcd*1111

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

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

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

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

作者: 不爱吱声    时间: 2014-8-28 13:05
独角兽 发表于 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
作者: 独角兽    时间: 2014-8-28 13:35
不爱吱声 发表于 2014-8-28 13:05
不考虑借位的意思是不用考虑借位的不同情况,不是不借位,呵呵,写得着急了点.

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

呵呵,牛!

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

我不会编程,所以觉得编程麻烦。但是现在觉得用程序算胜在思路简单,步骤麻烦点其实没啥。思路复杂了,更容易想错,或者想不出来。还似乎计算机厉害,跟少林寺罗汉拳似的。
作者: 不爱吱声    时间: 2014-8-28 13:45
独角兽 发表于 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
不爱吱声 发表于 2014-8-28 13:45
如果你想学习一门编程语言就推荐你学python,是最接近自然语言的,而且数据结构丰富,有丰富的库,我现在工作 ...

嘿嘿,其实我是看了一本java教程。当然,记住多少我就不知道了。就是觉得我怎么能不会编程呢,感觉像是放弃了很大一片天空似的。下面有空我再想看编程的东西就看这个蟒蛇。你和轧叔都这么喜欢蟒蛇呢。
作者: 喜欢    时间: 2014-8-28 21:27
不爱吱声 发表于 2014-8-28 00:05
不考虑借位的意思是不用考虑借位的不同情况,不是不借位,呵呵,写得着急了点.

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

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

最喜欢这样严格的思路了,滴水不漏,童叟无欺,久经考验!
作者: 喜欢    时间: 2014-8-28 21:48
独角兽 发表于 2014-8-27 22:39
二当家的厉害,觉得这就是正道终极解法了。

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

二当家的编程,一是为了严格——电脑不允许手误、口误之类,你说的每一个字都必须对,它才认可;二是为了遍历——所有可能的题都对了,你出题的还有什么说的?那算法是肯定对了!
作者: 喜欢    时间: 2014-8-28 23:42
本帖最后由 喜欢 于 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)


作者: 喜欢    时间: 2014-8-29 02:12
本帖最后由 喜欢 于 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
接着来。这次是爆炸性的答案!

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

把ABCD乘以9;

8889x9=80001。


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

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

我傻了,我服了!

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

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

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


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

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




作者: 大脚丫    时间: 2014-8-29 11:34
喜欢 发表于 2014-8-29 10:53
接着来。这次是爆炸性的答案!

俺说过,俺把这题目给了一个朋友——一直被我奉为聪明人的朋友。果然不负我 ...

数学以前就没学的怎么好,现在陪着孩子一起学,也是速度上不来,去考试肯定完蛋。
这种题目是数论方面的,小学知识就可以解决,但是现在小学生要去学奥数才接触这类题目。

这道题我还要睡一觉才解决,昨天晚上就没做出来。

我的思路也是那个8889=10000-1111,然后列竖式计算。过程不复杂,和你前面列出来的差不多,但是有细微的不同。我的基本公式是这样的:

d=10-D
c=9-(C-D)
b=9-(B-C)
a=9-(A-B)

这样的公式方便记忆,但是要处理进位问题,就是这个进位昨天晚上把我难住了。

如:ABCD=7421, 这个例子高位上的数字都大于低位上的数字,所以没有进位问题,直接用公式,

d=10-D=10-1=9
c=9-(C-D)=9-(2-1)=8
b=9-(B-C)=9-(4-2)=7
a=9-(A-B)=9-(7-4)=6

得:abcd=6789

例二:ABCD=9026 ,这个就有进位问题了。

d=10=D=10-6=4
c=9-(C-D)=9-(2-6)=13 ;这里发生进位了,十位上的数字1要加到下面一位。
b=9-(B-C)+1=9-(0-2)+1=12;再次发生进位,十位上的数字1再次加到下面一位。
a=9-(A-B)+1=9-(9-0)+1=1

得:abcd=1234

这种算法容易记忆,但是和前面那个用10000来减的算法比起来就笨多了。

虽然慢了一点,但是我好歹自己想办法解决了。
作者: 喜欢    时间: 2014-8-29 11:52
大脚丫 发表于 2014-8-28 22:34
数学以前就没学的怎么好,现在陪着孩子一起学,也是速度上不来,去考试肯定完蛋。
这种题目是数论方面的 ...

说得很明白。
只是那几个公式是怎么推出来的,需要详细一点才好。

要说简单好算,我在60楼的“爆炸性解法”才是最简单的解法。
作者: 黑洞的颜色    时间: 2014-8-29 12:01
本帖最后由 黑洞的颜色 于 2014-8-29 12:05 编辑
喜欢 发表于 2014-8-29 10:53
接着来。这次是爆炸性的答案!

俺说过,俺把这题目给了一个朋友——一直被我奉为聪明人的朋友。果然不负我 ...


这个要佩服一下。能够直接看到乘数的结果的确是天才。

我的方法要直接一点,和你的方法原理是一样的,只不过注意到了进位关系而已。看到这个时已经差不多写完了,还是做个记录吧。

原理
1.        abcd*8889=abcd*(10000-1111)=abcd0000 – abcd*1111=???*10000+ABCD,
2.        只要考虑最后四位数字, 所以只有最后四位有关系。就是
10000-( abcd*1111)之最后四位=ABCD,
也即
( abcd*1111)之最后四位=10000-ABCD=MNOP 为四位数字(M可能为0)
3.         列出竖式乘法
                     abcd
  ×                 1111
=                   abcd
                   abcd
                 abcd
               abcd
=        ……….MNOP 是刚才得到的最后四位数。
显然
1)        P=d,
2)        O = c+d 的个位数=mod(c+d) 。
即我们定义mod(X)为数X的个位数。例如mod(3)=3; mod(12)=2; mod(10)=0.
在这一步可能有进位,也就是说c+d=O或者 c+d=10+O(进位)。为了以下说明方便,统一写成c+d=yO。即y=c+d可能的进位。进位时y=1, 否则y=0。
这样我们容易写出c=yO-d, 并且当O<d时 y=1  
例如O=9,d=8,则 c=mod(09-8)=1;
又如O=2,d=8,则 c=mod(12-8)= 4
3)        N = (b+c+d+y) 的个位数=mod(b+c+d+y)。y 是c+d可能的进位。
看上去复杂,其实除了未知b以外,等式右边真正有需要的只有c+d+y的个位数 , 记为x=mod(c+d+y)。
现在理解的关键在这一步:x就是c+d的各位数字之和。

例如 c=7, d=8 则c+d=15,其各位数字之和 x=1+5;
再例如c=1,d=2 则c+d=3, x=3;
再例如c=2,d=8,  x=1。
也就是说不断的加数字直到只剩下1位。
得到x之后我们就回到了2),只要计算N=mod(b+x), 可同理得
b=zN-x, z=1 if N<x。
4)        M=(a+b+c+d+z) 的个位数, 推理同上

这种方法没有特殊情况需要记忆,所以想明白之后计算起来很快。如果考虑到MNOP和ABCD的关系,基本上就是你的算法了。

这个说起来特别麻烦,实际上要是对模数和进位有了解的话(比如程序员),以上推理都不要,基本就能看出来。我猜二当家的就是用了近似的思路。


作者: 喜欢    时间: 2014-8-29 12:44
黑洞的颜色 发表于 2014-8-28 23:01
这个要佩服一下。能够直接看到乘数的结果的确是天才。

我的方法要直接一点,和你的方法原理是一样的,只 ...

谢谢你说得这么详尽,我比较明白你的思路了。

不过,对那个关键点还需要你指点一下:为什么mod(c+d+y)就是(c+d)各位数字之和?
作者: 大脚丫    时间: 2014-8-29 14:22
喜欢 发表于 2014-8-29 11:52
说得很明白。
只是那几个公式是怎么推出来的,需要详细一点才好。


没有详细写推导过程,主要是前面已经有朋友推导过了,我和前面的没有大的差异。

abcd*8889=abcd*(10000-1111)=abcd0000-abcd*1111

下面列竖式:(是个减法的竖式)

abcd0000
   abcd000
     abcd00
       abcd0
         abcd
-------------------
         ABCD

与下面这个等价!
abcd0000
   abcd000
     abcd00
       abcd0
        ABCD
-------------------
         abcd
     

排版不好弄,意思一下。转成横式,可以得出:

d=10-D
c=19-d-C=9+10-d-C=9+D-C=9-(C-D);这里是19是因为后面已经借了一位了。
b=28-(c+d)-B=9+19-(c+d)-B=9-B+C=9-(B-C);这里是28是因为后面已经借了两位了。
同上,a=9-(A-B)。

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

前面我没有理解60楼的方法,他的方法出色的地方是用到了乘法的特殊性,我们其他人的方法基本上是应用加法的特殊性。他是8889*9=80001,我们是10000-1111=8889。简直就是高下立判。
作者: 黑洞的颜色    时间: 2014-9-5 03:30
喜欢 发表于 2014-8-29 12:44
谢谢你说得这么详尽,我比较明白你的思路了。

不过,对那个关键点还需要你指点一下:为什么mod(c+d+y)就 ...

在这一步里

3)        N = (b+c+d+y) 的个位数=mod(b+c+d+y)。

注意到y 就是c+d 的进位,比如c=8, d=9, c+d=17, 则y=1. 那么在计算N的竖式里
N = b+c+d+y 的个位数 =b+8+9+1 的个位数 =b+18 的个位数 =b+8
注意到18的个位数 8 就是 c+d 的个位数 (7) 加上 进位了的 1。就是说把c+d的进位又加回来到个位数上来。


作者: loy_20002000    时间: 2017-2-8 00:06
abcd * 8889=abcd*(8888+1)=abcd*(1111*8 +1)=abcd*1111*8+abcd

示意图如下:

       abcd      
x)     1111
____________
       abcd
      abcd0
     abcd00
    abcd000
=        r1  

x)        8
+)     abcd
____________
      
[(a+b+c+d)*1000+(b+c+d)*100+(c+d)*10+d]*8+a*1000+b*100+c*10+d ===

(8a+8b+8c+8d)*1000+(8b+8c+8d)*100+(8c+8d)*10+8*d+a*1000+b*100+c*10+d

【(9a+8b+8c+8d)*1000+(9b+8c+8d)*100+(9c+8d)*10+9*d=xxxxxABCD】这是公式。由于9的乘积个位数都是唯一的,从D开始可以依次得到A的数字。

例题1:xxxxx4583

9*d=xxxxx4583,d=7。仅有7,D是3。

(9c+8d)*10+9*d=(9c+56)*10+63=(9c+56)*10+6*10+3=(9c+62)*10+3,c=4。仅当4时,C是8,下同。

(9b+32+56)*100+(36+56)*10+63=(9b+88)*100+92*10+63=(9b+88)*100+983=(9b+88)*100+9*100+83
=100*(9b+97)+63,b=2

(9a+16+32+56)*1000+(18+32+56)*100+(36+56)*10+63=(9a+104)*1000+11583=(9a+104)*1000+11*1000+583
=1000*(9a+115)+683,a=1


abcd=1247

例题2:xxxxx9026,楼主例

9*d=xxxxx9026,d=4




(9a+8b+8c+32)*1000+(9b+8c+32)*100+(9c+32)*10+36

(9c+32)*10+36=xxxxx9026,(9c+32)*10+10*3+6=(9c+35)+6,c=3




(9a+8b+24+32)*1000+(9b+24+32)*100+(27+32)*10+36
=(9a+8b+56)*1000+(9b+56)*100+626

(9b+56)*100+626=(9b+56)*100+100*6+26=100*(9b+62)+26,b=2




(9a+16+56)*1000+(18+56)*100+626=(9a+72)*1000+8026=(9a+72)*1000+1000*8+26
=(9a+80)+26,a=1


abcd=1234


计算得到的原数有无穷个,abcd的原数是xxxxxabcd。





欢迎光临 爱吱声 (http://aswetalk.net/bbs/) Powered by Discuz! X3.2