模板||快速冪

有那麼一種算法能夠讓計算a^b變得更快,那就是快速冪。若是直接暴力計算的話須要計算b次。時間蠻長的。
html

題目描述:

  輸入a,b.(a,b爲整數)計算a^b。ios

輸入輸出格式

輸入格式:算法

兩個整數a、b。.ui

輸出格式:spa

輸出「a^b=s」code

s爲運算結果htm

 

前提:你須要瞭解二進制,十進制。位運算的知識(固然也能夠沒有,萬事皆可模擬。)blog

沒有位運算的:ip

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<cmath>
using namespace std;
char e[10001];
int cd;
long long quickpow(long long a,char b[]) {
    long long ans=1,base=a;
    while(cd!=-1) {
        if(int(b[cd])!=0) ans*=base;//最後一位是1的話。
        base*=base;
        cd--;//抹去最後一位。
    }
    return ans;
}
void zh(long long a) {
    char zs[10001];
    int sum=0;
    while(a!=0) {
        zs[sum]=a%2;
        a/=2;
        sum++;
    }
    sum--;
    int js=sum;
    cd=sum;//轉換爲二進制後的最後一個元素的位置。
//如(10)10=(1010)2最後一個元素的位置爲三。
    for(int i=0;i<=sum;++i)
    {
        e[js]=zs[i];
        js--;
    }
}

int main() {
    long long a,b;
    cin>>a>>b;
    zh(b);//將b轉換爲二進制。
    cout<<quickpow(a,e);
    return 0;
}

代碼:ci

//省略...... 
long long quickpow(long long a,long long b)
{
    long long ans=1,base=a;
    while(b!=0)
    {
        if(b&1!=0) ans*=base;    
        base*=base;
        b>>=1;    //將b的二進制數向右移一位(至關於將b的二進制數的最後一位抹掉。)
    }
    return ans;
}

 

PS:不用位運算的代碼當指數爲零時須要特判!

注意:由於是乘方運算因此頗有可能會爆long long!

input:

2 11

output:

2048

先講一下(&、>>)位運算.

&:‘&’叫作按位與。做用:把參與運算的兩個數對應的二進制相與,只有對應的二進制均爲1時,結果(應該也是二進制的形式)的對應位才爲1,不然爲0。

>>:'>>'叫作右移。做用:把「>>」左邊的運算數的各二進制位所有右移若干位(「>>」右邊的那個數)。

以此樣例講一下吧。

(11)10=(1011)2。

如何將二進制轉換爲十進制那?

醬紫,1*2+1*21 (+0*22) +1*23

∴211=2(1*2+1*21 (+0*22) +1*23)。

小學咱們學過 an*am=an+m

∴211=21*22*28

快速冪就是這樣計算的!

模擬一下樣例:

ans=1,base=2。

11的二進制數爲1011,不爲0 進行循環直到爲0。

1011的最後一位爲1,ans*base。

若不爲1,就不進行ans*base。

base*base,就是由2變成了4(2^2)。

1011抹去最後一位直到爲0.

就是醬紫。

 

//轉載來自這裏

相關文章
相關標籤/搜索