有那麼一種演算法可以讓計算a^b變得更快,那就是快速冪。如果直接暴力計算的話需要計算b次。時間蠻長的。
輸入a,b.(a,b為整數)計算a^b。
輸入格式:
兩個整數a、b。.
輸出格式:
輸出「a^b=s」
s為運算結果
前提:你需要了解二進位制,十進位制。位運算的知識(當然也可以沒有,萬事皆可模擬。)
沒有位運算的:
#include#include#include
#include
#include
#include
#include
#include
using
namespace
std;
char e[10001
];int
cd;long
long quickpow(long
long a,char
b)
return
ans;
}void zh(long
long
a) sum--;
int js=sum;
cd=sum;//轉換為二進位制後的最後乙個元素的位置。如(10)10=(1010)2最後乙個元素的位置為三。
for(int i=0;i<=sum;++i)
}int
main()
**:
//省略......
long
long quickpow(long long a,long longb)
return
ans;
}
ps:不用位運算的**當指數為零時需要特判!
注意:因為是乘方運算所以很有可能會爆long long!
input:
2 11
output:
先講一下(&、>>)位運算.
&:『&』叫做按位與。作用:把參與運算的兩個數對應的二進位制相與,只有對應的二進位制均為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.
就是醬紫。
模板 快速冪 取餘運算
輸入b,p,k的值,求b p mod k的值。其中b,p,k k為長整型數。輸入輸出格式 輸入格式 三個整數b,p,k.輸出格式 輸出 b p mod k s s為運算結果 輸入輸出樣例 輸入樣例 1 2 10 9 輸出樣例 1 2 10 mod 9 7 硬來當然不是好方法。但是有乙個規律不知道各位...
快速冪 取餘運算
給你三個整數 b,p,k,求 b p mod k。輸入只有一行三個整數,分別代表 b,p,k。輸出一行乙個字串b p mod k s,其中b,p,k分別為題目給定的值,s為運算結果。對於100 的資料,保證0 leq b,p leq 2 1 leq k leq 2 快速冪的模板題,沒有什麼好說的。有...
取餘運算(mod,快速冪)
題目描述 輸入b,p,k的值,求bpmodk的值。其中b,p,k k為長整型數。輸入 輸入b,p,k的值。輸出 求bpmodk的值。輸入樣例 2 10 9 輸出樣例 2 10 mod 9 7 題目分析 對於任何乙個自然數b都有b 2 b 2 b 2 例如 19 2x9 1 所以,b19 b9 9 1...