速算法的奥秘


闲着(例如乘坐公交)的时候我会想些和工作有些关系而又不太紧密的问题,例如我发现一个数与9相乘,把结果中的每个各位数相加,其结果都是9,例如:

  1 * 9 = 9 (9 = 9)
  2 * 9 = 18 (1 + 8 = 9)
  3 * 9 = 27 (2 + 7 = 9)
  4 * 9 = 36 (3 + 6 = 9)
  ...
  9 * 9 = 81 (8 + 1 = 9)
  10 * 9 = 90 (9 + 0 = 9)
  11 * 9 = 99 (9 + 9 = 18)
  12 * 9 = 108 (1 + 0 + 8 = 9) 
  ...
  1250 * 9 = 11250 (1 + 1 + 2 + 5 = 9)
  1251 * 9 = 11259 (1 + 1 + 2 + 5 + 9 = 18)
  1252 * 9 = 11268 (1 + 1 + 2 + 6 + 8 = 18)
   
当然,说结果都是9并不正确,像11 * 9 = 99(9 + 9 = 18),但可以发现,不管哪个数与9相乘,把结果中的每位数相加,得到的和必定是9的倍数。  

为什么会这样呢?我没有答案。看看她有什么用吧!假设你在做算术选择题:
   
  1111250 * 9 的结果是以下哪个数?
   
  A) 100002350 B) 10002250 C)10001250 D) 10005250

知道我们上面的规律后,你只需要做简单的加法就能得出结果。

类似的可以提高运算速度的还有,也是关于乘法的,不过这次与9无关。通常我们做乘法是列竖式,以 12 * 12为例子,我们有:

  1 2
  x 1 2
  ------- 
  2 4
 + 1 2
  -------
  1 4 4
   
可以知道最终的结果是144,这是传统的做法。吃饱了没事的我,偶然想到其实不这么做也可以得到结果。我的做法是:个位数相乘,可以得到乘积的尾数,个位数与另一乘数的十位数相乘,把两次相乘的结果相加,可以确定十位数,把两个乘数的十位数相乘,最终结果的
百位数就也确定了。这样,结果就出来了。以12 * 13为例:

  1 2
  x 1 3
  -------
  结果的个位数 = 两乘数的个位数相乘 = 2 * 3 = 6
  结果的十位数 = 两乘数的个十位数交叉相乘的和 = (1 * 3) + (1 * 2) = 5
  结果的百位数 = 两乘数的十位数相乘 = 1 * 1 = 1
   
结果就是156,怎么样?还不错吧。当然,这里回避了进位的问题,例如13 * 14的个位数相乘结果是12,需要进位。
   
  1 3
  x 1 4
  -------
  结果的个位数 = 两乘数的个位数相乘 = 3 * 4 = 2 (记住进位1)
  结果的十位数 = 两乘数的个十位数交叉相乘的和 = (1 * 4) + (1 * 3) = 7 + 1进位 = 8
  结果的百位数 = 两乘数的十位数相乘 = 1 * 1 = 1

结果是182。是不是觉得有点神奇呢?

有人说过,Great minds think alike。一天路边有人讲速算法,我听了下,竟发现他在讲我创造发明的方法,Great minds think alike,我对自己说。后来我因为这个方法要记住进位,认为它还是很复杂,遂放弃了进一步探索的努力。而那路边速算法的讲座,也因最终只剩两个听众,我觉得不大好意思,就急急的走了。可惜啊。

还是说说12 * 13吧,为什么我的方法能够奏效?以前我也是不只所以然。不过昨天我看一本叫做《什么是数学》的书,在书中看到个等式,是这样的:

  a^2 + 5a + 6 = (a + 2) * (a + 3) (中学数学课讲过的,叫方程式化解?)

我突然想到把12 * 13与它关联起来,一下子就明白了。让我把这层纸捅破吧!

12与13相乘的结果156可以看成 10 ^ 2 + 5 * 10 + 6(即156是a等于10时方程式a^2 + 5a + 6的化身),因为a^2 + 5a + 6可以转化为(a + 2) * (a + 3),所以156就可以转化为(10 + 2) * (10 + 3),也就是12 * 13,见下式:

  156 = 10^2 + 5*10 + 6 = (10 + 2) * (10 + 3) = 12 * 13 

Eureka!我上面发明创造的特殊计算方法不过是上面这个式子的从右到左的过程。  
   
我决定,下次再碰到那个讲速算法的人,我一定要和他聊一聊。我相信还有更好的方法等待发现。

你可能感兴趣的:(c,工作,算法)