如何快速计算任意数的幂次方?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1672个文字,预计阅读时间需要7分钟。
讲一个有趣的算法:如何快速求 \( n^m \),其中 \( n \) 和 \( m \) 都是整数。今天讲一个有趣的算法:如何快速求 \( (n^m) \),其中 \( n \) 和 \( m \) 都是整数。为了方便起见,此处假设 \( m=0 \)。对于 \( m=0 \) 的情况,求出 \( (n^m)=(n^0) \) 后,我们得到 \( 1 \)。
讲个有趣的算法:如何快速求 ,其中 n 和 m 都是整数今天讲个有趣的算法:如何快速求 \(n^m\),其中 n 和 m 都是整数。
为方便起见,此处假设 m >= 0,对于 m < 0 的情况,求出 \(n^{|m|}\) 后再取倒数即可。
另外此处暂不考虑结果越界的情况(超过 int64 范围)。
当然不能用编程语言的内置函数,我们只能用加减乘除来实现。
n 的 m 次方的数学含义是:m 个 n 相乘:n*n*n...*n,也就是说最简单的方式是执行 m 次乘法。
直接用乘法实现的问题是性能不高,其时间复杂度是 O(m),比如 \(3^{29}\) 要执行 29 次乘法,而乘法运算是相对比较重的,我们看看能否采用什么方法将时间复杂度降低。
设 m = x + y + z(x、y、z 都是整数),我们知道有如下数学等式: \(n^m\) = \(n^{x+y+z}\) = \(n^x * n^y * n^z\)。
也就是说,如果我们已经知道 \(n^x\)、\(n^y\)、\(n^z\) 的值,是不是就可以直接用他们相乘得出 \(n^m\)的结果?这样的话乘的次数就大大降低了。
于是问题就变成应该将 m 拆成怎样的几个数的和。
本文共计1672个文字,预计阅读时间需要7分钟。
讲一个有趣的算法:如何快速求 \( n^m \),其中 \( n \) 和 \( m \) 都是整数。今天讲一个有趣的算法:如何快速求 \( (n^m) \),其中 \( n \) 和 \( m \) 都是整数。为了方便起见,此处假设 \( m=0 \)。对于 \( m=0 \) 的情况,求出 \( (n^m)=(n^0) \) 后,我们得到 \( 1 \)。
讲个有趣的算法:如何快速求 ,其中 n 和 m 都是整数今天讲个有趣的算法:如何快速求 \(n^m\),其中 n 和 m 都是整数。
为方便起见,此处假设 m >= 0,对于 m < 0 的情况,求出 \(n^{|m|}\) 后再取倒数即可。
另外此处暂不考虑结果越界的情况(超过 int64 范围)。
当然不能用编程语言的内置函数,我们只能用加减乘除来实现。
n 的 m 次方的数学含义是:m 个 n 相乘:n*n*n...*n,也就是说最简单的方式是执行 m 次乘法。
直接用乘法实现的问题是性能不高,其时间复杂度是 O(m),比如 \(3^{29}\) 要执行 29 次乘法,而乘法运算是相对比较重的,我们看看能否采用什么方法将时间复杂度降低。
设 m = x + y + z(x、y、z 都是整数),我们知道有如下数学等式: \(n^m\) = \(n^{x+y+z}\) = \(n^x * n^y * n^z\)。
也就是说,如果我们已经知道 \(n^x\)、\(n^y\)、\(n^z\) 的值,是不是就可以直接用他们相乘得出 \(n^m\)的结果?这样的话乘的次数就大大降低了。
于是问题就变成应该将 m 拆成怎样的几个数的和。

