有那麼一種算法能夠讓計算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*20 +1*21 (+0*22) +1*23。
∴211=2(1*20 +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.
就是醬紫。
//轉載來自這裏