埃及乘法算法详解

如果有人问你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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

who_am_i__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值