平方数的口算或巧算
看到电视里讲 999*999 的口算方法: 先去掉一个 9 , 得到 99, 然后后面写个8, 然后 8 前面有几个 9, 后面就写几个 0, 最后加个1, 得到 998001. 敏感的我一看就其中肯定是从计算法则中挖掘的规律。而且没有这么复杂。请看
999*999 =(1000-1)^2 = 1000*1000 - 2*1000 + 1 = (1000-2) * 1000 + 1*1
因此更简单的口诀是: 前面写个 998, 后面写个 001. 前面有几个数, 后面就有几个数。
不信, 你算算, 9999999*9999999 = 99999980000001
依次类推, 9997 × 9997 = 99940009
9988 × 9988 = 99760144
你找到口诀了吗? 99XX 距离 10000 假设是 N , 那么 最终的得数是 (99XX-N)【前半部分】(N×N)【后半部分】。 其中前后部分的数位相同。 因此, 会出现“数越大反而越好算”的“奇怪”规律。
同理, 可以计算 99966 × 99966 = 9993201156 其中 99932 = 99966 - (100000-99966) , 1156 = 34*34
计算原理: 99XX * 99XX= (10000 - N) ^2 = (N-10000)^2 = (10000-2N)×10000 + N*N = ((10000-N)-N)*10000+N*N
注意到 只要9的数目大于或等于非9的数目,就可以使用这个方法快速计算出平方数
这样, 你就可以将高位数的平方转化为低位数的平方。对于高位数来说, 你所需要的只是加减法和保持数位相同。 如果低位数平方比较快的话, 真的可以直接写出答案哦!
对于两位数的平方, 上面的规律依然适用。 比如 86*86 = [86-14]00 + 14*14 = 7396 这样的话,需要熟悉低位数的平方。
1. 首先, 个位数为5的平方非常好算。 低两位总是25, 高两位是十位数×(十位数+1)
比如, 45*45 = (4*5)25 = 2025, 65*65 = (6*7)25=4225
计算原理: (A*10 + 5)^2 = A*A*100 + 100A + 25 = A(A+1)*100 + 25
2. 其次, 可以通过容易计算的数的平方来推导所要计算的数的平方: a*a = b*b + (a+b)(a-b)
相邻的两个数的平方之差等于两个数的和: (A*10+B+1)^2 - (A*10+B)^2 = (A*10+B)(A*10+B+1)
11*11 = 121, 12*12 = 144, 13*13 = 169 , 14*14 = 169 + (13+14) = 196 , 15*15 = 225, 16*16 = 225 + 31 = 256
据此,可以推导任意数的平方, 只要能够对加减法快速口算。
(A*10+B)^2 - (A*10+D)^2 = [((A*10+B) + (A*10+D) ] * (B-D)
34*34 = 30*30 + 4*64 = 1156 或者 34*34 = 35*35 - (34+35) = 1225 - 69 = 1156
78*78 = 75*75 + 3*153 = 5625 + 459 = 6084 或者 78*78 = 6400 - 2*158 = 6084
离5比较近的就使用X5作为临近数,离0比较近的就使用X0作为临近数。
两位数的平方还有一种奇淫巧计(需要三位数加法快速口算):
78 * 78 = (7*7)(8*8) + 2*7*8*10 = 4964 + 1120 = 6084 = (496+112)*10 + 4
67*67 = 3649 + 840 = 4489 = (364+84)*10 + 9
计算原理: (A*10+B)*(A*10+B) = (A*A*100 + B*B) + 20AB = [A*A][B*B] + 20AB
= 10*[10A*A+(B*B-x)/10 + 2AB] + x
x 是 B*B 的个位数。
这样, 就解决了两位数平方的口算或巧算问题。
三位数的平方(高位数加法+两位数平方):
(100A+10B+C)^2 = 100*(10A+B)^2 + (10B+C)^2 + (2AC-B*B)*100
764*764 = 76*76 *100 + 64*64 + (56-36)*100 = 577600 + 4096 + 2000 = 583696
另外一种算法:
(100A+10B+C)^2 = 10000A*A+100B*B+C*C + 2000AB + 200AC+2BC
=[A*A][B*B][C*C] + (千位加 2AB, 百位加2AC, 十位加 2BC)
764*764 = 493616 [Base] , 个位数是 6,
十位加 2BC = 361 + 48 = 409, 十位数是9, 百位加 2AC = 940 + 56 = 996, 百位数是 6, 千位加2AB = 499 + 84 = 583
最终得数 = 583696
123*123 = 010409 [Base] , 个位是 9,
十位加 2BC = 040 + 12 = 052 , 十位是 2, 百位加 2AC = 105 + 6 = 111, 百位是 1, 千位加 2AB = 011 + 4 = 15
最终得数 = 15129
497*497 = 168149 [Base], 个位是 9,
十位 = 814+126 = 940, 0, 百位 = 694 + 56 = 750 , 0 , 千位 = 175 + 72 = 247
最终得数 = 247009
AB5*AB5 = (10A+B)(10A+B+1)[25] = ([A*A][B*(B+1)] + (十位加2AB+A)))[25]
比如:785*785 = (78*79)[25] = (4972 + 1120+70)[25] = 616225
435*435 = (43*44)[25] = (1612+240+40)[25] = 189225
从三位数的平方可以获得计算的一个方法: 最终结果 = 基数 + 增量。
其中基数可以通过个位数平方或乘法直接写出, 而增量则保证尽力容易计算。
四位数平方如法:
(1000A+100B+10C+D)^2 = [A*A][B*B][C*C][D*D]
+ 10(2CD) + 100(2BD) + 1000(2AD+2BC) + 10000(2AC) + 100000(2AB)
计算:
4953*4953 = 16812509 [Base]
10: 250 + 30 = 280, 0, 100: 128 + 54 = 182, 2,
1000: 818 + 2(4*3+5*9) = 932, 2
10000: 693 + 40 = 733, 3, 100000: 173+72 = 245
最终得数: 24532209
总之, 任何口算或巧算, 其实都有一个计算公式在后面支撑。 而这个计算公式无非是将各个计算项进行重组, 使得更容易口算或巧算得到数位的数字。
那么, 实际的竞赛考验什么技能呢? 就要说到神奇的“一脑二用”能力了。选手在写加减法结果的时候,同时在计算剩下的结果。注意到写结果是“IO运算”, 是相对慢的, 计算则是“CPU运算”, 是相对比较快的。因此,观众看到选手直接写出结果就会感到很神奇了。不过诸如我等没有经过训练的人,估计就难以做到了。 从另一个角度来说, 有了计算机的辅助, 人根本就不需要自己去发现规律了, 只要掌握方法, 让计算机去学习和发现规律, 不是更省事了么? 因此,我的观点是: 这些速算类奥赛基本已经失去意义, 与其花时间做这种事情, 不如让学生更好地掌握计算机技能(可以在不到三秒内计算出一百万的平方数,还能永久保存,写成好几本书), 掌握探索世界运行法则的方法和规律, 也许你会发现, 学生将能创造一个令人惊叹的世界。
另外, 如果一堆人围着某个发现“神奇法则”的人去听那些奇淫巧计却不思考其中原理, 就有点说不过去了。因为这意味着大量时间的浪费(国内用来消遣时间的节目实在太多了,以至于人们除了待在电视机旁不知道还能做什么事)。而事实上,只要有初中的代数基础, 你自己都可以发现这些规律。这也是我写本文的初衷。然而国人宁可选择逃避选择被忽悠也不愿意自己去思考这个世界的运行法则,于是“泱泱大国”只是人多的代名词,还给人一种虚幻的光环。人多除了拿砍刀打群架、充当廉价劳动力比较有优势以外, 其他真没什么可说的了。 因为真正的战争开始时, 只要黑掉敌方的通信设施和基础设施, 那么敌方就算人再多,也只是待宰的羔羊; 轰炸机一来, 人如蝼蚁。
计算 1-N 的平方数: 只要 19 行代码 (甚至只要一行,奇淫巧技,呵呵), 你就可以在3秒内计算一百万以内的所有数的平方数(其中, 计算结果只需要0.3s, 输出结果大约 2.6s)。
def square2(n): return map(lambda x,y: x*x+y, [ x for x in range(n) ], [2*x+1 for x in range(n) ]) def square(n): ''' cal square of [1-n] ''' sq_init = 0 sq_diff = 1 f = open('squares.txt', 'w') the_range = [x+1 for x in range(n)] for num in the_range: sq_res = sq_init + sq_diff sq_init = sq_res sq_diff += 2 f.write('%d*%d=%d\n' % (num, num, sq_res)) f.close() if __name__ == '__main__': #square(1000000) sq_result = square2(1000000) with open('squares.txt', 'w') as f: f.writelines("%s*%s=%s\n" % (ind+1, ind+1, sq_result[ind]) for ind in range(len(sq_result)))
数,
像瀑布一样飘落;
我却深深呼唤,
心爱的人儿。
时光如流水逝去,
心不禁有些胆颤;
生命之中呵,
还是多渴望:
可以有一个人,
一起相携而行,
落下欢笑的记忆,
载着人生的欢喜。
不管那世事变迁,
不求那丰功伟绩。