快速幂

【快速幂】

快速幂就是快速算出底数的n次幂,它的复杂度为log(n),相比朴素的O(n)有了极大的提高,故因此得名

蛮力算法

以求 2n 为例,最直接的办法就是将n个2相乘,即:

\[2 \times 2 \times2 \times2 \times2 \times.........{有n个2} = 2^n \]

时间复杂度为 O(log)

#include<iostream>
using namespace std;

// 蛮力算法递归版 
int pow2_brute_recursive(int n)
{
	if( n == 0)
		return 1;
	return 2*pow2_brute_recursive(n-1);
	
}
// 蛮力算法迭代版 
int pow2_brute_iteration(int n)
{
	int res = 1;
	while(n--){
		res *= 2;
	}
	return res;
}

int main()
{
	cout<<"pow2_brute_recursive(8) = "<<pow2_brute_recursive(8)<<endl;
	cout<<"pow2_brute_iteration(8) = "<<pow2_brute_iteration(8)<<endl;
    return 0;
}

快速幂相乘

原理:

\[pow2(n)= \begin{cases} n\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad(若n<=1)\\ pow2(\lfloor n/2 \rfloor)^2\times2 \quad\quad\quad\quad\quad(n>0\quad and\quad odd)\\ pow2(\lfloor n/2 \rfloor)^2\quad\quad\quad\quad\quad\quad\quad(n>0\quad and\quad even) \end{cases} \]

#include<iostream>
using namespace std;

/*
      快速幂,时间复杂度O(logn)
      求 2^n
*/
int square(int n)
{
    return n*n;
}
//递归版本
int pow2_recursive(int n)
{
    if(n==0)
        return 1;
    return (n&1)?square(pow2_recursive(n>>1))<<1
                 :square(pow2_recursive(n>>1));
}
//迭代版本
int pow2_iteration(int n)
{
    int pow = 1;
    int p=2;
    while(0 < n)
    {
       if(n&1)
         pow *=p;
      p *= p;
      n >>= 1;
    }
    return pow;
}

/*
    快速幂迭代版,时间复杂度O(logn)
    求 a^n
*/
int pow(int a,int n)
{
    int pow = 1;
    int p = a;
    while(0 < n)
    {
        if(n&1)
          pow *= p;
        p *= p;
        n >>= 1;
    }
    return pow;
}


int main()
{
   cout<<"pow2_recursive(5): "<<pow2_recursive(5)<<endl;
   cout<<"pow_iteration(5): "<<pow_iteration(5)<<endl;
   cout<<"pow(5,3): "<<pow(5,3)<<endl;

    return 0;
}
posted @ 2019-09-08 12:35  dekeshile  阅读(73)  评论(0编辑  收藏  举报