埃及乘法算法详解

如果有人问你3×3等于多少,你肯定毫不犹豫的回答是9。那如果是41×69呢,你肯定会那张纸出来列个竖式或者拿计算器算一下也能很快得出正确的结果。但是如果是在古代没有9 9乘法表还没有出现乘法概念的时候,你怎么去算呢?

对于乘法:n×a,简答来说就是对a进行n次累加。

那么要想算41×59就可以这么算:

59+59+59+......+59 一直累加41次,这种算法简单粗暴,但效率低不适用于较大数字的乘法运算。

用现在的思想来描述这种算法就是:

当n=1时,1a = a; 当n>1时 na = (n-1)a + a:

c++实现:

int multiply(int n,int a){
    if(n==1) return a;  // n = 1的情况
    return multiply(n-1,a) + a; // n 大于 1的情况
}

对于上面的代码,初学者看起来不太直观。我们可以用高中的数学知识来证明:

我们把函数multiply(n,a)记作f(n,a)

当n=1时,f(1,a) = a 对应 if(n==1) return a; // 终止条件

当n > 1时,f(n,a) = f(n-1,a) +a对应 return multiply(n-1,a) + a;

这样是不是就直观多了。

埃及乘法的思路是:将n减半,并将a加倍,同时求出a的各种倍数,这些倍数与a的比值都是2的整数次幂。简单来所说就是na=n/2*2a

在古埃及是没有n和a这种变量来描述算法的他们会直接举例,比如41x59:

1        59--------------1x59=59

2        118-------------1x2x59=59+59

4        236-------------1x2x2x2x59=118+118

8        472-------------1x2x2x2x2x59=236+236

16        944------------1x2x2x2x2x2x59=472+472

32        1888-----------1x2x2x2x2x2x2x59=944+944

我们可以看到左边的值都是2的整数次幂,中间的值都等于左边的值乘以59。这里我们可以看到1+8+32正好等于41那么41x59=59+471+1888。这样下来计算步骤就减少了很大一部分。

这里还要考虑n是奇数还是偶数

当n是偶数时n=n/2=>even(n),当n是奇数时n=(n-1)/2+(n-1)/2 + 1=>odd(n);

这里的算法用c++表示为:

bool odd(int n){return n & 0x1;} //判断奇偶性
int half(int n){return n >> 1}; // 计算n/2

int multiply(int n,int a){
    if(n==1) return a;
    int result = multiply(half(n),a+a); // 当n为偶数是f(n,a)=f(n/2,a)=n/2*2a
    if(odd(n)) result = result + a; // 当n是奇数时half(n)会漏掉一个1,所以要加a
    return result;
}

你可能感兴趣的:(算法,c++,程序人生)