简单快速幂

快速幂可以节省大量计算时间

两种方式  递归和迭代 通常需要取模避免溢出

1.递归

 

#define Mod 100000
int quick(int a,int n)
{
    if(n==0)
        return 1;
    else if(n%2==1)
    {
        return quick(a,n-1)*a%Mod;
    }
    else 
    {
        int temp = quick(a,n/2)%Mod;
        return temp*temp%Mod;
    }
}

2,迭代

为了方便理解,从最初开始优化

例如 7^5 = (7^4)*(7^1) 

4不断除2

 = (49^2)*(7^1)

 得到结果

比循环计算速度快,幂越大,速度差距越明显

#define Mod 100000
int quick(int a,int n)
{
    int result = 1;//结果
    while(n>0)//幂次直到为0停止
    {
        if(n%2==0)//次幂为偶数
        {
            n = n/2;
            a=a*a%Mod;  //相当于上文(7^4)中4变2,底数为49  

        }
        else//奇数先乘a,计算偶次幂的结果
        {
            n = n-1;
            result = a*result%Mod; //对应上文 (7^5)中先乘7将5减一变偶数
            n = n/2;
            a=a*a%Mod;
        }
    
    }
  return result; }

 

合并简化代码

#define Mod 100000
int quick(int a,int n)
{
    int result = 1;
    while(n>0)
    {
        if(n%2==1)
        {
            result = a*result%Mod;
        }    
            n = n/2; 
            a=a*a%Mod;

    }
    return result;
}

下列小小简化下

int quick(int a,int n)
{
    int result = 1;
    while(n)
    {
        if(n&1) //n%2==1 判断为奇数
        {
            result*=a;
        }
     n>>1;//n = n/2 a
*=a; }
  return result; }

 

posted @ 2020-06-29 17:30  海拉尔  阅读(128)  评论(0编辑  收藏  举报