m * n
就是将 m 进行 n 次累加。如果简单的使用 for 循环,当循环次数很大时无疑很慢。
因此我们可以考虑使用迭代。“一生二,二生三,三生万物”,这句话在这里可以得到体现。比如 5 * 9,1 * 9 = 9;2 * 9 = 9 + 9 =18;4 * 9 = 18 + 18 = 36;5 * 9 = 36 + 9 = 45;
因此 5 * 9 最终转化为了 4 * 9 + 1 * 9。乘法转化为了加法。通过观察可以发现 5 的 二进制为 0b101,刚好符合 4 * 9 + 1 * 9。
因此任何乘法都可以转换为加法。m * n,将 m 转为 2 进制,然后逐位求出其位数对应的乘积,相加便是最终的结果。
例如 13 * 16, 13可以转化为 0b1101,依次迭代,
1 | 1 1 0 1 |
结果相加为 128 + 64 + 16 = 208 。
转化为算法:
1 | func mul(m int, n int) int { |
Gitalk 加载中 ...