本帖最后由 oyangningtao 于 2022-1-22 11:36 编辑
接下来,再让我们用代码来演示一下上面的算法:
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power % 2 == 0) {
//如果指数为偶数
power = power / 2;//把指数缩小为一半
base = base * base % 1000;//底数变大成原来的平方
} else {
//如果指数为奇数
power = power - 1;//把指数减去1,使其变成一个偶数
result = result * base % 1000;//此时记得要把指数为奇数时分离出来的底数的一次方收集好
power = power / 2;//此时指数为偶数,可以继续执行操作
base = base * base % 1000;
}
}
return result;
}我们再来测试一下此时的快速幂算法和普通的求幂算法的效率,我们仍然来求2的1000000000次方,看一看用时又会是多少:
真让人简直不可思议,竟然只花了0.002秒就求出了结果,而且结果也是376,然而普通的算法却用了将近18秒的时间才求出最后的结果。 压榨性能再优化 虽然上面的快速幂算法效率已经很高了,但是我们仍然能够再一次的对其进行“压榨级别”的优化。我们上面的代码看起来仍然有些地方可以再进一步地进行简化,例如在if和else代码块中仍然有重复性的代码: - power = power / 2;
- base = base * base % 1000;
而 - power = power - 1;//把指数减去1,使其变成一个偶数
- power = power / 2;
可以压缩成一句: power = power / 2; 因为power是一个整数,例如当power是奇数5时,power-1=4,power/2=2;而如果我们直接用power/2=5/2=2。在整型运算中得到的结果是一样的,因此,我们的代码可以压缩成下面这样: - long long fastPower(long long base, long long power) {
- long long result = 1;
- while (power > 0) {
- if (power % 2 == 1) {
- result = result * base % 1000;
- }
- power = power / 2;
- base = (base * base) % 1000;
- }
- return result;
- }
接下来,我们来测试一下优化后的性能如何,仍然是求2的1000000000次方: 结果仍然是正确的376,但时间上的花费从0.002减少成了0.001。
|