看到電視里講 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)))
數,
像瀑布一樣飄落;
我卻深深呼喚,
心愛的人兒。
時光如流水逝去,
心不禁有些膽顫;
生命之中呵,
還是多渴望:
可以有一個人,
一起相攜而行,
落下歡笑的記憶,
載着人生的歡喜。
不管那世事變遷,
不求那豐功偉績。