次方求模(快速冪問題)
快速冪問題(求a^b)
我們都知道當指數為偶數的時候,對於a**b,可以變為(a**2)**(b/2)。 而當指數為奇數的時候,對於a**b,可以化簡為a*(a**(b-1)),然後即可以化簡為a*((a**2)**((b-1)/2)) 如此我們便可知道 如果b為奇數,則將b減一除二,將一個a取到外面,同時對裡面的a平方。 如果b為偶數,則直接除二,同時對a平方。 若b為7,a為2。 則a變為4,b變為3,ans變為2*(2**2)**3。 然後繼續向後運,(注意此時a為4),a變為16,b變為1,ans變為2*4*(2**2**2)**1。 結果為128。
若b為10,a為2。 則a變為4,b變為5,ans變(2**2)**5。 然後繼續向後運,(注意此時a為4),a變為16,b變為2,ans變為4*(2**2**2)**2。 再之後(注意此時a為16),a變為256,b變為1,ans變為4*(2**2**2**2)**1。 結果為1024。
在這應注意b每次變化的時候都會對a平方(當然,也可以當b為奇數的時候使b減一,然後再判斷為偶數),為不影響結果,在這我們應該在引入一個變數(ans),在對b進行加減的時候我們應匯出一個a對ans進行變換,而不是直接改變a。只有當b除2時才對a進行改變,使其平方。 最開始做的時候因為未引入一個新的變數,在對b減一的時候對直接讓a*a,和平方效果一樣…而結果當然是程式出現了錯誤…丟人…求大佬們別笑話…而且我一個萌新理解的也不是很透徹…歡迎大佬來告訴我哪裡寫的不好,不到位…多來指點…
下面就寫程式碼了… 因為題是求a**b%c 在此我就直接打這一題的答案了 共有n組資料 每組有a b c三個輸入資料
n=int(input()) for i in range(n): a,b,c=[int(x)for x in input().split()] a=a%c #為避免出現a大於c的情況,先對a取餘 ans=1 while b!=0: if b%2==1: #若b為奇數 b=b//2 #b-1除2,直接取整商即可 ans=(ans*a)%c #若為奇數則控制ans乘一個此時的a else: #若b為偶數 b=b/2 #直接除2即可 a=(a*a)%c #每次迴圈均會對a平方 print(ans) #根據同餘定理,我們可以在每次迴圈後都對資料進行求模,可以縮短程式執行的時間
該程式碼是我根據其他改編而來 原始碼while迴圈如下:
while b!=0:
if b&1: #按位與運算 判斷b是否為奇數
ans=(ans*a)%c
b>>=1 #相當於b//2
a=(a*a)%c
開啟新成就,完成第一篇部落格,希望大佬們看見不好的地方給我指出來,私聊告訴我最好,畢竟最好給我留一點面子。