快速求幂的递归与非递归的方法

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long int ll;
ll mi(ll a,ll b)//递归方法:b为奇数则a^b=a*a^(b-1),其中b-1又为偶数;b为偶数则a^b=a^(b/2)*a^(b/2)
{
    
    
    if(b==0) return 1;
    if(b&1)  return a*mi(a,b-1);
    else{
    
    
        ll c=mi(a,b/2);
        return c*c;
    }
}
ll mi(ll a,ll b)//非递归方法:例如a=2,b=9;则b=1001,另外2^9=2^8*2^1其中8=2^3,1=2^0对应b的二进制的1位
{
    
    
    ll ans=1;
    while(b>0)
    {
    
    
        if(b&1)
            ans=ans*a;
        a=a*a;
        b=b>>1;
    }
    return ans;
}
int main()
{
    
    
   ll a,b;
   cin>>a>>b;
   cout<<mi(a,b);
}

猜你喜欢

转载自blog.csdn.net/weixin_44142774/article/details/113075856